├── .gitignore
├── hello_world.py
├── requirements.txt
├── FB一般廣告V1.png
├── FB一般廣告V2.png
├── FB早鳥優惠廣告V2.png.gz
├── gcp_vertex_ai
├── requirements.txt
├── 螢幕擷取畫面 2024-10-23 215526.png
├── uploads
│ └── 螢幕擷取畫面 2024-10-24 151252.png
├── Dockerfile
├── templates
│ └── index.html
├── README.md
├── 雲育鏈課程QA問答知識.csv
├── app.py
├── qa_converted.json
└── app_with_similar_tune.py
├── flask_web_demo.py
├── cloudstorage_integrate_demo.py
├── cxcxc.html
├── app.py
├── integrate_flask_cloudstorage.py
├── gke_intro.md
├── Dockerfile
├── iam_intro.md
├── cloud_run.md
├── ai-agent.md
├── REVIEW.md
├── compute_engine.md
├── iam_master_and_ops.md
├── cloud_shell_intro.md
├── llm_intro.md
├── cloud_shell_editor_intro.md
├── compute_engine_new.md
├── README.md
└── iam_adv.md
/.gitignore:
--------------------------------------------------------------------------------
1 | .theia
2 | launch.json
--------------------------------------------------------------------------------
/hello_world.py:
--------------------------------------------------------------------------------
1 | print("多數程式語言環境已建置")
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | google-cloud-storage
2 | Flask==3.0.0
3 | gunicorn==20.1.0
4 | Werkzeug==3.0.1
--------------------------------------------------------------------------------
/FB一般廣告V1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cxcxc-io/gcp_basic_architecture_tutorial/HEAD/FB一般廣告V1.png
--------------------------------------------------------------------------------
/FB一般廣告V2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cxcxc-io/gcp_basic_architecture_tutorial/HEAD/FB一般廣告V2.png
--------------------------------------------------------------------------------
/FB早鳥優惠廣告V2.png.gz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cxcxc-io/gcp_basic_architecture_tutorial/HEAD/FB早鳥優惠廣告V2.png.gz
--------------------------------------------------------------------------------
/gcp_vertex_ai/requirements.txt:
--------------------------------------------------------------------------------
1 | flask
2 | google-cloud-aiplatform
3 | google-cloud-storage
4 | gunicorn
5 | Werkzeug
--------------------------------------------------------------------------------
/gcp_vertex_ai/螢幕擷取畫面 2024-10-23 215526.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cxcxc-io/gcp_basic_architecture_tutorial/HEAD/gcp_vertex_ai/螢幕擷取畫面 2024-10-23 215526.png
--------------------------------------------------------------------------------
/gcp_vertex_ai/uploads/螢幕擷取畫面 2024-10-24 151252.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cxcxc-io/gcp_basic_architecture_tutorial/HEAD/gcp_vertex_ai/uploads/螢幕擷取畫面 2024-10-24 151252.png
--------------------------------------------------------------------------------
/flask_web_demo.py:
--------------------------------------------------------------------------------
1 | from flask import Flask
2 | app = Flask(__name__)
3 |
4 | @app.route('/')
5 | def hello_world():
6 | return 'Hello, World!'
7 |
8 | app.run(host="0.0.0.0", port=8081)
--------------------------------------------------------------------------------
/cloudstorage_integrate_demo.py:
--------------------------------------------------------------------------------
1 | from google.cloud import storage
2 |
3 | # 啟用客戶端
4 | storage_client = storage.Client()
5 |
6 | # 調度瀏覽功能
7 | buckets = storage_client.list_buckets()
8 |
9 | # 打印桶子
10 | for bucket in buckets:
11 | print(bucket.name)
--------------------------------------------------------------------------------
/cxcxc.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | cxcxc雲育鏈
10 |
11 | 雲育鏈官網
12 |
13 |
14 |
--------------------------------------------------------------------------------
/app.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | from flask import Flask
4 |
5 | app = Flask(__name__)
6 |
7 |
8 | @app.route("/")
9 | def hello_world():
10 | """Example Hello World route."""
11 | name = os.environ.get("NAME", "World")
12 | return f"Hello {name}!"
13 |
14 |
15 | if __name__ == "__main__":
16 | app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
--------------------------------------------------------------------------------
/integrate_flask_cloudstorage.py:
--------------------------------------------------------------------------------
1 | from flask import Flask
2 | from google.cloud import storage
3 | app = Flask(__name__)
4 | # 啟用客戶端
5 | storage_client = storage.Client()
6 |
7 |
8 | @app.route('/')
9 | def hello_world():
10 | # 調度瀏覽功能
11 | buckets = storage_client.list_buckets()
12 | bucket_result=''
13 | for bucket in buckets:
14 | bucket_result= bucket_result + bucket.name + " \r\n "
15 | return bucket_result
16 |
17 | app.run(host="0.0.0.0",port=8081)
18 |
--------------------------------------------------------------------------------
/gke_intro.md:
--------------------------------------------------------------------------------
1 | # 課程前,得先做過Cloud Run 的Lab
2 |
3 |
4 |
5 | # 建立Cluster, 觀看幾處細節
6 |
7 | 右上角可以轉換成虛擬機版本,看到有課程說的Node Pool
8 |
9 | 網路篇,簡單說明
10 |
11 | Control Plane簡單說明
12 |
13 | DataPlane 簡單說明
14 |
15 | Security 簡單看過
16 |
17 |
18 | # 建立叢集之後,做軟體Deploy
19 |
20 | 選擇已存在的image,選擇cxcxc-demo
21 |
22 | 設定Environment variables
23 |
24 | Name aws-saa-all-architecture
25 | PORT 5000
26 |
27 | 設定環節
28 |
29 | 解釋Deployment 跟 namespace
30 |
31 | 設定Expose
32 |
33 | target port 改為5000
34 |
35 |
36 | # 切換到cloud load balancing
37 |
38 |
39 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | # Use the official lightweight Python image.
2 | # https://hub.docker.com/_/python
3 | FROM python:3.9-slim
4 |
5 | # Allow statements and log messages to immediately appear in the Knative logs
6 | ENV PYTHONUNBUFFERED True
7 |
8 | # Copy local code to the container image.
9 | ENV APP_HOME /app
10 | WORKDIR $APP_HOME
11 | COPY . ./
12 |
13 | # Install production dependencies.
14 | RUN pip install -r requirements.txt
15 |
16 | # Run the web service on container startup. Here we use the gunicorn
17 | # webserver, with one worker process and 8 threads.
18 | # For environments with multiple CPU cores, increase the number of workers
19 | # to be equal to the cores available.
20 | CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 app:app
--------------------------------------------------------------------------------
/gcp_vertex_ai/Dockerfile:
--------------------------------------------------------------------------------
1 | # Use the official lightweight Python image.
2 | # https://hub.docker.com/_/python
3 | FROM python:3.9-slim
4 |
5 | # Allow statements and log messages to immediately appear in the Knative logs
6 | ENV PYTHONUNBUFFERED True
7 |
8 | # Copy local code to the container image.
9 | ENV APP_HOME /app
10 | WORKDIR $APP_HOME
11 | COPY . ./
12 |
13 | # Install production dependencies.
14 | RUN pip install -r requirements.txt
15 |
16 | # Run the web service on container startup. Here we use the gunicorn
17 | # webserver, with one worker process and 8 threads.
18 | # For environments with multiple CPU cores, increase the number of workers
19 | # to be equal to the cores available.
20 | CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 app:app
--------------------------------------------------------------------------------
/iam_intro.md:
--------------------------------------------------------------------------------
1 | # IAM 初探
2 |
3 | ## Step 1
4 |
5 | 在先前的Instance發現無法訪問Cloud Storage,原因在於有Service Account。
6 |
7 | #### 創建Service Account
8 | 設定如下
9 | ```
10 | name : cxcxc-sa-operate-cs
11 | role: Storage管理員
12 | ```
13 |
14 | 對該機器關機,並Attach Service account 至該機器上,而後開機並連入,操作下列語句
15 |
16 | ```
17 | gsutil ls
18 | ```
19 |
20 | 發現權限已可使用,但缺點很明顯,就是權限開得太大了。
21 |
22 | ## Step 2
23 |
24 | 參考資料:
25 | https://cloud.google.com/iam/docs/conditions-overview
26 | https://cloud.google.com/iam/docs/conditions-resource-attributes
27 |
28 | 為Service Account的權限添加Condition
29 |
30 | 將下列your-bucket-name改為 我方bucket名
31 | ```
32 | projects/_/buckets/your-bucket-name
33 | ```
34 |
35 | 而後連入instance內
36 |
37 | ```
38 | # 發現被禁止
39 | gsutil ls
40 |
41 | # 發現可正常瀏覽
42 | gsutil ls gs://your-bucket-name
43 | ```
44 |
--------------------------------------------------------------------------------
/cloud_run.md:
--------------------------------------------------------------------------------
1 | # 打開cloud shell editor , 下載教材
2 |
3 | https://ssh.cloud.google.com/cloudshell/editor?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fcxcxc-io%2Fgcp_basic_architecture_tutorial.git&cloudshell_open_in_editor=cloud_shell_editor_intro.md&cloudshell_workspace=.
4 |
5 | # 打開terminal, 切換project
6 |
7 | ```
8 | gcloud config set project YOUR-PROJECT-ID
9 | ```
10 |
11 | # 確認有個Dockerfile
12 |
13 | # 確認有個app.py
14 |
15 | # (optional) 在cloud shell editor 預載執行
16 |
17 | ```
18 | pip3 install -r requirements.txt
19 | python3 app.py
20 | ```
21 |
22 | # 建立artifact registry
23 |
24 | ```
25 | gcloud artifacts repositories create cxcxc-demo --location=asia-east1 --repository-format=docker
26 | ```
27 |
28 | # 透過cloud build 打包成image, 並存放在artifact registry
29 |
30 | ```
31 | gcloud builds submit --tag asia-east1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/cxcxc-demo/web-app:0.0.1
32 | ```
33 |
34 | # 打開cloud run 介面,進行部屬
35 | 可設定環境變數 NAME為任意值
36 |
--------------------------------------------------------------------------------
/ai-agent.md:
--------------------------------------------------------------------------------
1 | 建立Service account,權限為
2 | ```
3 | Vertex AI User
4 | ```
5 |
6 |
7 | 建立GCE,Service account 指定為剛剛建立的Service account,並安裝Dify
8 | ```
9 | #!/bin/bash
10 |
11 | # 腳本名稱: startup-script
12 |
13 | echo "等待 apt-get 鎖定被釋放..."
14 |
15 | # 檢查 dpkg 和 apt 的鎖定檔案,如果發現被佔用,則等待 10 秒後重試
16 | while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 || fuser /var/lib/apt/lists/lock >/dev/null 2>&1 ; do
17 | echo "偵測到 apt-get 正在運行,等待 10 秒..."
18 | sleep 10
19 | done
20 |
21 | echo "apt-get 鎖定已釋放,繼續執行安裝..."
22 |
23 | curl -fsSL https://get.docker.com -o get-docker.sh
24 | sh get-docker.sh
25 | service docker start
26 |
27 | curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
28 | chmod +x /usr/local/bin/docker-compose
29 | git clone -b 1.8.1 https://github.com/langgenius/dify.git
30 | cd dify/docker
31 | docker-compose up -d
32 | ```
33 |
34 | # Lab1 - AI-Agent的第一次嘗試
35 |
36 | 目標: 知曉 LLM 與 Prompt
37 |
38 | # Lab2 - Workflow的第一次嘗試
39 |
40 | # Lab3 - 透過參數抽取器 做自然語言的json處理
41 |
42 | # Lab4 - 透過問題分類器 做新型態的IF ELSE
43 |
44 | # Lab5 - 透過LLM節點,做進階回復。
45 |
46 |
--------------------------------------------------------------------------------
/REVIEW.md:
--------------------------------------------------------------------------------
1 | # GCP
2 |
3 | ### Project 為基底資源管理
4 |
5 | # CloudBilling
6 |
7 | ### 建置帳單帳戶(供付款使用)
8 |
9 | ### 設置快訊(Alarm,帳單警告)
10 |
11 | # Cloud VPC
12 |
13 | ### VPC建置
14 |
15 | ### Route配置 - 僅允許特定標籤的用戶可訪問Internet Gateway
16 |
17 | ### Firewall建置 - 並考慮使用Cloud IAP,使可用GCP Console 管理私網機器
18 |
19 | #### (Optional) Private Google Access 建置
20 | #### Cloud NAT建置
21 | #### Cloud VPN 建置
22 | #### Network Peering Connection 建置
23 |
24 | # Cloud Storage
25 |
26 | ### Bucket建置
27 |
28 | ### 存取權限設置 - IAM or ACL
29 |
30 | #### 資料保護相關措施
31 |
32 | # Cloud IAM - 管理
33 |
34 | ### 建置 Service account,並給予有條件的Role
35 |
36 | ### 引入 Member account(用戶),並給予其調度Service account的權限
37 |
38 | ### 配發Service account 的 Credential 給 用戶
39 |
40 | # Cloud Shell & Editor
41 |
42 | ### 登入專案
43 |
44 | ### 以https連結,快速打造公司專案環境與程式碼,快速協作
45 |
46 | ### 將service account的credential 結合環境變數,開發者在寫程式時,可編寫安全的程式碼。
47 |
48 | ### 以命令列調度service account,將本地的程式資源,放到遠端Cloud Storage Bucket
49 |
50 | # Compute Engine
51 |
52 | ## 部署階段
53 |
54 | ### 開啟機器階段,選用機型與 Service account
55 |
56 | ### 開啟機器階段,並透過Metadata 設置 外部環境變數
57 |
58 | ### 開啟機器階段,設置Startup-script,將Storage內的程式拉取安裝部署
59 |
60 | ### 開啟機器階段,設定Network-tag,允許ssh或public-subnet訪問
61 |
62 | ## 維護管理階段
63 |
64 | ### 啟用OS Login 功能,後續人員皆能以email登入該機器管理。
65 |
66 |
--------------------------------------------------------------------------------
/compute_engine.md:
--------------------------------------------------------------------------------
1 | # STEP 1
2 |
3 | 開機之後,嘗試安裝 男人的浪漫老遊戲,並把先前的網頁載入進來,發現Compute Engine也能跟GCP Resource溝通。
4 |
5 | 連入之後的指令如下
6 | ```
7 | curl -fsSL https://get.docker.com -o get-docker.sh
8 | sudo sh get-docker.sh
9 | sudo service docker start
10 | sudo docker run -d --name dosgame -p 80:262 oldiy/dosgame-web-docker:latest
11 | ```
12 |
13 | # STEP 2
14 |
15 | ### Startup-script
16 |
17 | ```
18 | #!/bin/bash
19 |
20 | curl -fsSL https://get.docker.com -o get-docker.sh
21 | sh get-docker.sh
22 | service docker start
23 | docker run -d --name dosgame -p 80:262 oldiy/dosgame-web-docker:latest
24 |
25 | ```
26 |
27 | 訪問外部IP,發現有網頁
28 |
29 | 瀏覽tmp資料夾,確認沒有cxcxc檔案
30 | ```
31 | ls /tmp
32 | ```
33 |
34 | # STEP 3
35 |
36 | 對機器進行關機,並更新Startup-script內容,並撤下Service account,並在console內追加meatadata
37 |
38 | ### metadata內容值
39 |
40 | ```
41 | 欄位:內容
42 | METADATA_DEMO:cxcxc
43 |
44 | ```
45 |
46 | ### Startup-script
47 | ```
48 | #!/bin/bash
49 |
50 | curl -fsSL https://get.docker.com -o get-docker.sh
51 | sh get-docker.sh
52 | service docker start
53 | docker run -d --name dosgame -p 80:262 oldiy/dosgame-web-docker:latest
54 |
55 | METADATA_DEMO=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/METADATA_DEMO" -H "Metadata-Flavor: Google")
56 | touch /tmp/$METADATA_DEMO
57 |
58 | ```
59 |
60 | 編輯完成後,再開機,並連入
61 |
62 | 連入後,觀察tmp資料夾,發現已有檔案出現
63 | ```
64 | ls /tmp
65 | ```
66 |
67 | # STEP4
68 |
69 | 重新以gsutil訪問桶子,發現沒有service account 不能訪問
70 | ```
71 | gsutil ls
72 | ```
73 |
74 | 從內部訪問Webserver,發現可行
75 | ```
76 | curl localhost:80/cxcxc.html
77 | ```
78 |
79 | 從外部訪問,發現無法訪問,原因是在於firewall沒開放
80 |
81 | 為該instance貼network-tag,內容如下
82 |
83 | ```
84 | http-server
85 | ```
86 |
87 |
88 |
89 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/iam_master_and_ops.md:
--------------------------------------------------------------------------------
1 | # Lab1 - Service Account的重複創建
2 |
3 | ## 建置Service Account
4 |
5 | 設定Service account 名字為
6 |
7 | `cxcxc-sa-demo`
8 |
9 | 給予 `Storage Object Viewer` 的Role
10 | ***
11 |
12 | ## 建立GCE Instance
13 |
14 | 規格選擇 e2-micro
15 |
16 | 地區選擇 台灣
17 |
18 | 服務帳戶選用先前建置的`cxcxc-sa-demo`
19 |
20 | ***
21 |
22 | ## 連入Instance
23 |
24 |
25 | 使用gsutil驗證權限
26 | ```
27 | gsutil ls
28 | ```
29 | ***
30 |
31 | ## 移除Service Account,並重新建立Service Account
32 |
33 | 設定Service account 名字為
34 |
35 | `cxcxc-sa-demo`
36 |
37 | 給予 `Storage Object Admin` 的Role
38 |
39 | 在Instance內,重新輸入
40 | ```
41 | gsutil ls
42 | ```
43 | 關機,重新設定Service account為 `cxcxc-sa-demo`
44 |
45 | 開機連入Instance,重新輸入
46 | ```
47 | gsutil ls
48 | ````
49 |
50 | ***
51 |
52 | # Lab2 - 客製化Role
53 |
54 | ## 創建Role,並附加至Service Account
55 |
56 | 創建Role,名為
57 |
58 | `CloudStorageReadOnly`
59 |
60 | 選用下方兩個動作
61 |
62 | ```
63 | storage.objects.get
64 | storage.objects.list
65 | ```
66 |
67 | 找到先前建置的cxcxc-sa-demo 服務帳戶,權限更換為此Role
68 |
69 | ## 測試Service Account的權限
70 |
71 | 為cxcxc-sa-demo 服務帳戶,追加自身Role為`Service account token creator `
72 |
73 | ### 啟用Cloud shell,輸入下方指令
74 |
75 | ```
76 | gsutil -i <你的服務帳戶全名> ls
77 |
78 | gsutil -i <你的服務帳戶全名> cp README.md <你的Cloud Storage Bucket名>
79 | ```
80 |
81 | # Lab3 - 設定可設定其他權限的角色
82 |
83 | ### 切換至IAM 管理介面,添加第二用戶,賦予
84 |
85 | ```
86 | Project IAM Admin Role
87 | ```
88 |
89 | 設置條件,此條件為關鍵,只允許該用戶管理特定服務的權限,範例為僅允許授權Storage Admin
90 |
91 | ```
92 | api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/storage.admin'])
93 | ```
94 | ***
95 | ### 切換為第二用戶,透過第二用戶,添加第三用戶
96 |
97 | 權限為 Storage Viewer,發現失敗
98 |
99 | 將權限改為 Storage Admin,發現成功
100 |
101 | ### 切換為第三用戶,透過第三用戶,操作Cloud Storage
102 |
103 | ```
104 | gcloud config set project <你的project-id>
105 | gsutil ls
106 | ```
107 |
108 |
109 | # Lab4 OpsAgent體驗
110 |
111 | 建立Service account
112 |
113 | 建立一台GCE Instance,透過Startup-script安裝stress
114 | ```
115 | #!/bin/bash
116 | apt-get install -y stress
117 | ```
118 | 設置alarm與notification
119 |
120 | 安裝opt agent
121 |
122 | 連入後,進行軟體壓力測試
123 | ```
124 | nohup stress -c 2 -m 2 --vm-bytes 512M -t 600s &
125 | ```
126 | 收到警告
127 |
128 |
129 | 移除警告
130 |
131 |
132 | 機器刪除
133 |
--------------------------------------------------------------------------------
/cloud_shell_intro.md:
--------------------------------------------------------------------------------
1 | # 本地端使用gcloud
2 |
3 |
4 | ```
5 | # 登入aws console
6 | # 啟用aws 的cloud shell vm,充當外部筆電
7 | https://cxcxc-learning.signin.aws.amazon.com/console
8 |
9 | # 在裡面植入gcloud sdk套件庫
10 | sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM
11 | [google-cloud-sdk]
12 | name=Google Cloud SDK
13 | baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el7-x86_64
14 | enabled=1
15 | gpgcheck=1
16 | repo_gpgcheck=0
17 | gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
18 | https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
19 | EOM
20 |
21 | # 安裝gcloud sdk
22 | sudo yum install -y google-cloud-sdk
23 |
24 |
25 | # 登入指令,而後彈跳出一個網址,點擊後,輸入google帳號進行驗證
26 | # gcloud auth login
27 | gcloud init --console-only
28 |
29 | # 設定要操作的專案
30 | gcloud config set project {PROJECT_ID}
31 | ```
32 |
33 |
34 | # 在Cloud Shell 內使用gcloud
35 |
36 | 省略了 gcloud auth login 這個環節,直接跳到設定操作專案的環節
37 |
38 | ```
39 | gcloud config set project {PROJECT_ID}
40 | ```
41 |
42 | # 使用gsutil 訪問 cloud storage
43 |
44 | 不要記指令,只需要記核心名詞,而後丟到Google去快速檢索。
45 |
46 | 比如 gsutil bucket list 就能馬上找到範例
47 |
48 | https://cloud.google.com/storage/docs/listing-buckets
49 |
50 | google goo得好, 工程師當到老。
51 |
52 | ```
53 | # 瀏覽 當前專案下所有的bucket
54 | gsutil ls
55 |
56 | # 瀏覽 bucket內,有哪些object
57 | gsutil ls gs://your-bucket-name/folder/
58 |
59 | # 將準備好的範例網頁,而後將該檔案上傳 至 指定的bucket內
60 | gsutil cp cxcxc.html gs://your-bucket-name/folder/
61 |
62 | # 瀏覽 bucket內,有哪些object
63 | gsutil ls gs://your-bucket-name/folder/
64 |
65 | # 刪除 該object,範例,先不要用
66 | # gsutil rm gs://your-bucket-name/folder/object
67 |
68 |
69 |
70 | ```
71 | # 調度那些GCP沒放在Console上的功能
72 | ```
73 | # 瀏覽 bucket目前的屬性
74 | gsutil ls -L -b {YOUR-BUCKET-NAME}
75 |
76 | # 對桶子設定版本號
77 | gsutil versioning set on {YOUR-BUCKET-NAME}
78 |
79 | # 瀏覽 bucket目前的屬性
80 | gsutil ls -L -b {YOUR-BUCKET-NAME}
81 |
82 | # 關閉桶子的版本號
83 | gsutil versioning set off {YOUR-BUCKET-NAME}
84 |
85 | ```
86 |
87 | # 變更Cloud Shell的基底環境
88 |
89 | ```
90 | # .customize_enviroment 是cloud shell預設的隱藏腳本
91 | echo touch /tmp/cxcxc_demo.txt > ~/.customize_environment
92 |
93 | # 透過網頁重新啟動cloud shell
94 |
95 | # 搜尋 /tmp 資料夾,發現已有cxcxc_demo.txt檔案
96 | ls /tmp
97 |
98 | ```
99 |
100 | # 清除Cloud Shell環境
101 |
102 | ```
103 | # 刪除家目錄內所有內容
104 | sudo rm -rf $HOME
105 |
106 |
107 | # 透過網頁重新啟動cloud shell
108 |
109 | ```
110 |
--------------------------------------------------------------------------------
/llm_intro.md:
--------------------------------------------------------------------------------
1 | # 理解LLM、System Prompt之間的關係
2 |
3 | ## 進入Google AI Studio網站進行註冊
4 |
5 | google 搜尋 google ai studio,或點下方網址進入
6 | ```
7 | https://aistudio.google.com/
8 | ```
9 |
10 | ## 建立第一個AI-Agent
11 |
12 | 點擊 create a prompt
13 |
14 | 設定 System Instruction
15 | ```
16 | 如果有人問 雲端證照的內容時,妳會跟她說雲端證照的用途,可作為 政府標案、補助計劃的資質證明。
17 |
18 | 並告訴他 可以google搜尋雲育鏈,得到更多資料。
19 | ```
20 |
21 | 進行對話
22 | ```
23 | 請問雲端證照有什麼用
24 | ```
25 |
26 | ## 觀察介面
27 |
28 | 右上角有個Model,可以做選擇。
29 |
30 | # 理解System Prompt 與 User Prompt之間的差異
31 |
32 | ## 建立第二個AI-Agent
33 |
34 | 點擊 Create Prompt
35 |
36 | 設定System Instruction
37 | ```
38 | 如果有人問 雲端證照的內容時,妳會跟她說雲端證照的用途,可作為 政府標案、補助計劃的資質證明。
39 |
40 | 並告訴他 可以google搜尋雲育鏈,得到更多資料。
41 | ```
42 |
43 | 在下方對話框內,詢問 ai-agent
44 |
45 | ```
46 | 雲端證照能有什麼用途
47 | ```
48 |
49 | 在下方對話框內,告知ai-agent
50 | ```
51 | 以後有人問雲端證照的時候,就告訴他有aws-saa證照、aws-ai證照、gcp-ace證照
52 | ```
53 |
54 | 在下方對話框內,重新再詢問一次ai-agent
55 |
56 | ```
57 | 雲端證照能有什麼用途
58 | ```
59 |
60 | 在下方對話框內,告知ai-agent
61 |
62 | ```
63 | 以後有人問aws-saa的時候,就告訴他
64 | https://www.cxcxc.io/aws-solution-architect-course/
65 |
66 | 以後有人問gcp-ace的時候,就告訴他
67 | https://www.cxcxc.io/gcp-ace/
68 |
69 | 以後有人問aws-ai的時候,就告訴他
70 | https://www.cxcxc.io/aws-certified-ai-practitioner-and-aigc-agent-course/
71 | ```
72 |
73 | 在下方對話框內,重新再詢問一次ai-agent
74 |
75 | ```
76 | aws-saa證照是什麼?能有什麼用途?
77 | ```
78 |
79 | # 資訊系統交互的核心 – API 與 Json
80 |
81 | ## 啟用 Structured output
82 |
83 | Create a prompt
84 |
85 | 啟用右方的Structured output
86 |
87 | 設定所需要的json格式, 選擇Code Editor模式
88 | ```
89 | {
90 | "type": "object",
91 | "properties": {
92 | "cloud_type": {
93 | "type": "string"
94 | },
95 | "certificate_name": {
96 | "type": "string"
97 | }
98 | }
99 | }
100 | ```
101 |
102 | 設定System Instruction
103 | ```
104 | 當用戶詢問特定雲端的相關認證時,自動調度Structure output,生成json
105 | ```
106 |
107 | 用戶詢問
108 | ```
109 | 我想要考aws saa 該怎麼辦?
110 | ```
111 |
112 | # 交付給遠端系統前的資料前處理 – Code Execution
113 |
114 | 關閉 Structured output
115 |
116 | 啟用 Code execution
117 |
118 | 設定 System instruction,告知什麼時候該用 Code execution
119 | ```
120 | aws-saa課程費用,一人為84020元
121 | 如果有人問aws-saa的課程費用多少錢時,詢問對方要上課人數,並透過code execution進行費用計算
122 | ```
123 |
124 | # 替代傳統if else 的大武器 – Function Calling
125 |
126 | 關閉 Code execution
127 |
128 | 啟用 Function Calling,進行編輯
129 | ```
130 | [
131 | {
132 | "name": "aws_qa",
133 | "description": "用戶詢問的問題與aws相關"
134 | },
135 | {
136 | "name": "gcp_qa",
137 | "description": "用戶詢問的問題與gcp相關"
138 | }
139 | ]
140 |
141 | ```
142 | 設定 System instruction,告知什麼時候該用 Function calling
143 | ```
144 | 當用戶詢問雲端相關問題的時候,交由Function calling 判斷,該由哪個function 回應
145 | ```
146 |
147 | 用戶問話
148 | ```
149 | 我aws的ec2故障了,該怎麼辦呢
150 | ```
151 |
--------------------------------------------------------------------------------
/cloud_shell_editor_intro.md:
--------------------------------------------------------------------------------
1 | # Cloud Shell Editor的大功用
2 |
3 | 讓大家的環境都給統一起來,比如建構統一的專案環境。
4 |
5 | 複製下方連結,貼回瀏覽器上。
6 |
7 | 我們會發現他把github資料夾給下載到cloud shell內了。
8 |
9 |
10 | https://ssh.cloud.google.com/cloudshell/editor?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fcxcxc-io%2Fgcp_basic_architecture_tutorial.git&cloudshell_open_in_editor=cloud_shell_editor_intro.md&cloudshell_workspace=.
11 |
12 |
13 | reference:
14 | https://cloud.google.com/shell/docs/open-in-cloud-shell#url_parameters
15 |
16 | 可以嘗試看看抓其他的資料夾,未來可以使用他的container image
17 |
18 |
19 | ## 設置資料夾為工作目錄(optional)
20 |
21 | 對新增的資料夾點擊右鍵,設置Workspace
22 |
23 | ## 先行安裝環境
24 | ```
25 | sudo pip3 install -r requirements.txt
26 | ```
27 |
28 | ## 執行 hello_world.py
29 |
30 | 啟用terminal,觀察 Cloud Shell的Python3開發環境
31 |
32 | 在terminal內,使用python3執行hello_world.py
33 |
34 | ```
35 | python3 --version
36 |
37 | python3 hello_world.py
38 | ```
39 | ## 執行 flask_web_demo.py
40 |
41 | 點開flask_web_demo.py,得知其內容是啟用web server
42 |
43 | 在terminal內,使用python3執行flask_web_demo.py
44 |
45 | 彈跳出網頁連結,發現我方仍可觀看網頁開發結果
46 |
47 | ```
48 | python3 flask_web_demo.py
49 | ```
50 | ## 執行 cloudstorage_integrate_demo.py
51 |
52 | 點開cloudstorage_integrate_demo.py,得知python調度cloudstorage的方式。
53 |
54 | 程式碼不要記,只需要記住關鍵字
55 | python list bucket cloud storage
56 |
57 | https://cloud.google.com/storage/docs/listing-buckets#storage-list-buckets-python
58 |
59 |
60 | 在terminal內,使用python3執行cloudstorage_integrate_demo.py
61 |
62 | ```
63 | python3 cloudstorage_integrate_demo.py
64 |
65 | ```
66 |
67 | 發現不能執行,原因在於沒有指定Project
68 |
69 | 兩種方案
70 |
71 | ### 第一種方案在當前terminal切換專案,並在當前terminal執行python腳本
72 |
73 | ```
74 | gcloud config set project {YOUR-PROJECT-ID}
75 | python3 cloudstorage_integrate_demo.py
76 | ```
77 |
78 | ### 第二種追加客製腳本,使自動進入專案
79 |
80 | #### 打開客製化腳本,並鍵入 i ,開始編輯
81 |
82 | https://cloud.google.com/shell/docs/configuring-cloud-shell#gcloud_command-line_tool_preferences
83 |
84 |
85 | ```
86 | vim ~/.bashrc
87 | ```
88 |
89 | #### 將下方Project-ID名更改後,貼入檔案內的最下方
90 | ```
91 | gcloud config set project {YOUR-PROJECT-ID}
92 | ```
93 |
94 | #### 重新啟用一個terminal
95 |
96 |
97 | #### 運行腳本,發現可瀏覽所有bucket
98 |
99 |
100 | # Web Server與CloudStorage整合
101 |
102 | 打開integrate_flask_cloudstorage.py,得知內容是Web server整合 cloud storage
103 |
104 | 點開terminal,以python3執行integrate_flask_cloudstorage.py
105 |
106 | 發現已可編寫一個具備GCP調度能力的WEB應用
107 |
108 | ```
109 | python3 integrate_flask_cloudstorage.py
110 | ```
111 |
112 | # 下一步教材準備
113 |
114 | ## 使用命令列,將 cxcxc.html放入先前建置好的Bucket(optional)
115 |
116 | ```
117 | gsutil cp cxcxc.html gs://YOUR-BUCKET-NAME/FOLDER/
118 | ```
119 |
120 | ## 假裝我們已經開發完了,軟體的部屬指令如下
121 |
122 | ```
123 | docker run -d --name dosgame -p 8080:262 oldiy/dosgame-web-docker:latest
124 | ```
125 |
126 |
127 |
128 |
129 |
130 |
--------------------------------------------------------------------------------
/gcp_vertex_ai/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | AI 對話框
7 |
73 |
74 |
75 | AI 對話框
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
--------------------------------------------------------------------------------
/compute_engine_new.md:
--------------------------------------------------------------------------------
1 | # STEP 1
2 |
3 | 開機之後,嘗試安裝 男人的浪漫老遊戲,並把先前的網頁載入進來,發現Compute Engine也能跟GCP Resource溝通。
4 |
5 | 連入之後的指令如下
6 | ```
7 | curl -fsSL https://get.docker.com -o get-docker.sh
8 | sudo sh get-docker.sh
9 | sudo service docker start
10 | sudo docker run -d --name dosgame -p 443:262 oldiy/dosgame-web-docker:latest
11 | sudo docker run -d -p 80:5000 -e PORT=5000 -e METADATA_DEMO=abc b97607065/gcp_metadata_demo:0.0.3
12 | ```
13 |
14 | # STEP 2
15 |
16 | ### Startup-script
17 |
18 | ```
19 | #!/bin/bash
20 |
21 | # 腳本名稱: startup-script
22 |
23 | echo "等待 apt-get 鎖定被釋放..."
24 |
25 | # 檢查 dpkg 和 apt 的鎖定檔案,如果發現被佔用,則等待 10 秒後重試
26 | while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 || fuser /var/lib/apt/lists/lock >/dev/null 2>&1 ; do
27 | echo "偵測到 apt-get 正在運行,等待 10 秒..."
28 | sleep 10
29 | done
30 |
31 | echo "apt-get 鎖定已釋放,繼續執行安裝..."
32 |
33 | # 1. 安裝 Docker
34 | # 下載 Docker 安裝腳本並執行
35 | curl -fsSL https://get.docker.com -o get-docker.sh
36 | sh get-docker.sh
37 |
38 | # 2. 啟動 Docker 服務
39 | # 這是必要的,否則後面的 docker 指令會失敗
40 | echo "啟動 Docker 服務..."
41 | systemctl start docker
42 |
43 | # 3. 執行第一個 Docker 容器
44 | echo "啟動 dosgame 容器..."
45 | docker run -d --name dosgame -p 443:262 oldiy/dosgame-web-docker:latest
46 |
47 | # 4. 執行第二個 Docker 容器
48 | echo "啟動 gcp_metadata_demo 容器..."
49 | docker run -d -p 80:5000 -e PORT=5000 -e METADATA_DEMO=abc b97607065/gcp_metadata_demo:0.0.3
50 |
51 | echo "所有腳本指令執行完畢!"
52 | ```
53 |
54 | 訪問外部IP,發現有網頁
55 |
56 | 瀏覽tmp資料夾,確認沒有cxcxc檔案
57 | ```
58 | ls /tmp
59 | ```
60 |
61 | # STEP 3
62 |
63 | 對機器進行關機,並更新Startup-script內容,並撤下Service account,並在console內追加meatadata
64 |
65 | ### metadata內容值
66 |
67 | ```
68 | 欄位:內容
69 | METADATA_DEMO:cxcxc
70 |
71 | ```
72 |
73 | ### Startup-script
74 | ```
75 | #!/bin/bash
76 |
77 | # 腳本名稱: startup-script
78 |
79 | echo "等待 apt-get 鎖定被釋放..."
80 |
81 | # 檢查 dpkg 和 apt 的鎖定檔案,如果發現被佔用,則等待 10 秒後重試
82 | while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 || fuser /var/lib/apt/lists/lock >/dev/null 2>&1 ; do
83 | echo "偵測到 apt-get 正在運行,等待 10 秒..."
84 | sleep 10
85 | done
86 |
87 | echo "apt-get 鎖定已釋放,繼續執行安裝..."
88 |
89 |
90 | curl -fsSL https://get.docker.com -o get-docker.sh
91 | sh get-docker.sh
92 | service docker start
93 |
94 | METADATA_DEMO=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/METADATA_DEMO" -H "Metadata-Flavor: Google")
95 | touch /tmp/$METADATA_DEMO
96 | docker run -d -p 80:5000 -e PORT=5000 -e METADATA_DEMO=$METADATA_DEMO b97607065/gcp_metadata_demo:0.0.3
97 | ```
98 |
99 | 編輯完成後,再開機,並連入
100 |
101 | 連入後,觀察tmp資料夾,發現已有檔案出現
102 | ```
103 | ls /tmp
104 | ```
105 |
106 | # STEP4
107 |
108 | 重新以gsutil訪問桶子,發現沒有service account 不能訪問
109 | ```
110 | gsutil ls
111 | ```
112 |
113 | 從內部訪問Webserver,發現可行
114 | ```
115 | curl localhost:80/cxcxc.html
116 | ```
117 |
118 | 從外部訪問,發現無法訪問,原因是在於firewall沒開放
119 |
120 | 為該instance貼network-tag,內容如下
121 |
122 | ```
123 | http-server
124 | ```
125 |
126 |
127 |
128 |
129 |
130 |
131 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # GCP經典課程Lab總覽
2 |
3 |
4 | *描述如下*
5 |
6 | 有部分實作,為瀏覽器行為操作,這種Lab請同學參照講義進行實作
7 | 還有另一部分實作,為指令或程式碼類型操作,請參照此Repo相關的檔案
8 |
9 | # Cloud Billing
10 |
11 | *參照講義,進行內容操作。*
12 |
13 | ## 1. 帳號、信用卡付費關聯與預算警告
14 |
15 |
16 | # Cloud Storage
17 |
18 | *參照講義,進行內容操作。*
19 |
20 | ## 1. 桶子建立、上下傳物件
21 |
22 | 參照講義,進行內容操作,在過程中,老師會逐步講解看到的實作環節背後的意義。
23 |
24 | ## 2. 桶子權限操作
25 |
26 | 參照講義,按實作圖進行操作,在過程中,老師將會逐步講解Cloud Storage的權限設計內容。
27 |
28 | ## 3. 利用桶子的快取進行節費
29 |
30 | 先將下面兩張圖片儲存到本地端
31 |
32 |
33 | https://github.com/cxcxc-io/gcp_basic_architecture_tutorial/blob/master/FB%E4%B8%80%E8%88%AC%E5%BB%A3%E5%91%8AV1.png
34 |
35 |
36 | https://github.com/cxcxc-io/gcp_basic_architecture_tutorial/blob/master/FB%E4%B8%80%E8%88%AC%E5%BB%A3%E5%91%8AV2.png
37 |
38 | 確認先前建立桶子的權限是對外公開
39 |
40 | 上傳第一張照片(FB一般廣告V1.png) 至先前的桶子,並點擊右方三個點,編輯中繼資料,找到Cache-Control的欄位,輸入下方欄位值
41 | ```
42 | public, max-age=90
43 | ```
44 |
45 | 儲存後,點擊該物件的公開連結,確認照片的模樣
46 |
47 | 將第二張照片(FB一般廣告V2.png)的名字改為(FB一般廣告V1.png), 上傳至先前的桶子,並點擊右方三個點,編輯中繼資料,找到Cache-Control的欄位,輸入下方欄位值
48 | ```
49 | public, max-age=90
50 | ```
51 | 儲存後,重新切換到無痕視窗,按下F12,打開Console,並點擊F5重新整理先前已下載圖片的瀏覽器頁面,發現要等一陣子才會變化
52 |
53 | ## 4. 儲存空間的優化節費
54 |
55 | 將準備好的壓縮圖檔(FB早鳥優惠廣告V2.png.gz)下載後,上傳到先前建立的bucket內,並點擊右方三個點,編輯中繼資料,找到Content-Type的欄位,輸入下方欄位值
56 |
57 | ```
58 | image/png
59 | ```
60 |
61 | 編輯中繼資料,找到Content-Encoding的欄位,輸入下方欄位值
62 |
63 | ```
64 | gzip
65 | ```
66 |
67 | 儲存後,複製該物件的公開連結,按下F12,打開Console,並貼入該連結,發現已可正常顯示為圖片。
68 |
69 |
70 | # Cloud Shell
71 |
72 | 請參照 [cloud_shell_intro.md](https://github.com/cxcxc-io/gcp_basic_architecture_tutorial/blob/master/cloud_shell_intro.md) 內的指令
73 |
74 |
75 | ## 1. 登入驗證,操作指定專案內的資源,以命令列操作CloudStorage
76 |
77 |
78 | ## 2. 透過客製化腳本,自動化更改用戶端的Cloud Shell環境,以利公司同仁們統一環境
79 |
80 |
81 | ## 3. 將用戶端的CloudShell環境,還原至最初始狀態
82 |
83 | # Compute Shell Editor
84 |
85 | 請參照 [cloud_shell_editor_intro.md](https://github.com/cxcxc-io/gcp_basic_architecture_tutorial/blob/master/cloud_shell_editor_intro.md) 內的流程指令
86 |
87 | ## 1. 讓CloudShell快速布建同事們需要的共同開發環境
88 |
89 | ## 2. 同事們依舊可以開發網頁應用
90 |
91 | ## 3. 同事們可以安全地調度雲端資源
92 |
93 | ## 4. 在雲端上製作整合雲端資源的網頁應用
94 |
95 | # Compute Engine
96 |
97 | 請參照 [compute_engine.md](https://github.com/cxcxc-io/gcp_basic_architecture_tutorial/blob/master/compute_engine.md) 內的流程指令
98 |
99 | ## 1.機器建立,並連入系統內,建立網頁伺服器
100 |
101 | ## 2.重建一台機器,並設置開機腳本,自動載入網頁
102 |
103 | ## 3.關機,重設置開機腳本,引入外部metadata
104 |
105 | ## 4.防火牆設置,並觀察到Service account的重要性
106 |
107 | # IAM 初探
108 |
109 | 請參照 [iam_intro.md](https://github.com/cxcxc-io/gcp_basic_architecture_tutorial/blob/master/iam_intro.md) 內的流程指令
110 |
111 | ## 1.Service account建置與權限配置
112 |
113 | ## 2.權限的限制條件實作
114 |
115 | ## 3.添加外部用戶進入帳號
116 |
117 | # VPC
118 |
119 | *參照講義,進行內容操作。*
120 |
121 | ## 1.建置具備經典公私網段的VPC
122 |
123 | ## 2.Cloud IAP調度使用,使內網可連線
124 |
125 | ## 3.建立Cloud NAT, 使限定的內網可連外作訪問
126 |
127 | # IAM進階探討
128 |
129 | 請參照 [iam_adv.md](https://github.com/cxcxc-io/gcp_basic_architecture_tutorial/blob/master/iam_adv.md) 內的流程指令
130 |
131 |
132 | ## 1.在非GCP的環境內使用User Credential 進行開發
133 |
134 | ## 2.用戶可透過任一Service Account 調度雲服務資源,強化本地開發安全性
135 |
136 | ## 3.用戶僅能透過指定Service Account調度雲服務資源,具體強化雲端安全
137 |
138 | ## 4.用戶在本地端經常性調度service account的方式,並進行程式碼開發
139 |
--------------------------------------------------------------------------------
/gcp_vertex_ai/README.md:
--------------------------------------------------------------------------------
1 | # GCP Vertex AI Chat Application
2 |
3 | 這個專案是一個簡單的 Flask 應用程式,允許用戶與 Vertex AI 的生成式模型進行對話,並可以上傳圖片進行處理。圖片會被儲存到 Google Cloud Storage 中。
4 |
5 | ## 專案結構
6 |
7 | ```
8 |
9 | GCP_VERTEX_AI/
10 | ├── templates/
11 | │ └── index.html # 前端 HTML 頁面
12 | ├── uploads/ # 用於本地存儲上傳文件的資料夾
13 | ├── app.py # Flask 應用程式主程式碼
14 | ├── Dockerfile # Docker 建置設定
15 | ├── README.md # 專案說明文件
16 | └── requirements.txt # Python 套件需求
17 |
18 | ```
19 |
20 |
21 | ## 環境變數
22 | 應用程式使用以下環境變數來配置:
23 | - `CLOUD_STORAGE_BUCKET`: 用於指定儲存圖片的 Google Cloud Storage bucket 名稱。
24 | - `MODEL_NAME`: 指定 Vertex AI 模型的名稱,預設為 `gemini-1.5-flash-002`。
25 |
26 |
27 | ## 在cloud shell editor 使用方式
28 |
29 | ### 1. 設定Project、安裝必要套件
30 |
31 |
32 | 首先點擊左上角Open Folder,指定gcp_vertex_ai為專案資料夾,確保你已經安裝 `google-cloud-storage` 和 `vertexai` 等 Python 套件。你可以執行以下指令來安裝:
33 |
34 | ```bash
35 | gcloud config set project 你的PROJECT-ID
36 | pip install -r requirements.txt
37 | ```
38 |
39 | ### 1-2. 為你的模型添加記憶(Optional)
40 |
41 | 在vertex ai studio內,添加example之後,選擇Get code,複製裡面的text1,並貼回我方的app.py,替代原有的text1
42 |
43 | ### 1-3. 打造自己的example(Optional)
44 |
45 | 準備一個QA 問答知識集 csv, 把qa_converted.json的資料樣本交給gpt,並將csv也交給gpt,進行格式轉換。
46 |
47 | 或用我方已準備好的qa_converted.json 上傳給vertex,點集 Get Code,取得裏面的變數text1
48 |
49 | ### 2. 在開發環境設定環境變數
50 |
51 | 開啟terminal,並設定環境變數,例如:
52 | ```
53 | export CLOUD_STORAGE_BUCKET=你的桶子名字
54 | export Model_NAME=如果想要換自己的模型或是其他模型
55 | ```
56 |
57 | ### 3. 啟動應用程式
58 | ```
59 | python app.py
60 | ```
61 |
62 | ### 4. 推送回Artifact Registry
63 |
64 | 建立 Artifact Registry
65 |
66 | ```
67 | gcloud artifacts repositories create cxcxc-vertex-ai-demo --location=asia-east1 --repository-format=docker
68 | ```
69 |
70 | 推送回 Artifact Registry
71 |
72 | ```
73 | gcloud builds submit --tag asia-east1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/cxcxc-vertex-ai-demo/ai-app:0.0.1
74 | ```
75 | ## 在Compute Engine 部屬的方式
76 |
77 | ### 1. 建立Service account
78 |
79 | 建立service account,名字為aigc-demo-sa,並派發以下IAM Role
80 |
81 | ```
82 | Storage Admin
83 | Vertex AI User
84 | Artifact registry reader
85 | ```
86 | ### 2. 建立機器,選用剛建立的Service-account,並設定防火牆
87 |
88 | Service account 選擇 aigc-demo-sa
89 |
90 | Access scopes 選擇 Allow full access to all Cloud APIs
91 |
92 | 勾選 允許http訪問
93 |
94 |
95 | ### 3. 建立機器,設定Startup-script
96 | ```
97 | #! /bin/bash
98 |
99 | # 安裝 Docker
100 | curl -fsSL https://get.docker.com -o get-docker.sh
101 | sh get-docker.sh
102 | service docker start
103 |
104 | # 獲取專案 ID
105 | PROJECT_ID=$(curl -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/project/project-id")
106 |
107 | # 配置 Docker 認證
108 | gcloud auth configure-docker asia-east1-docker.pkg.dev -q
109 |
110 | # 拉取容器映像
111 | docker pull asia-east1-docker.pkg.dev/$PROJECT_ID/cxcxc-vertex-ai-demo/ai-app:0.0.1
112 |
113 | # 從元數據服務獲取 CLOUD_STORAGE_BUCKET
114 | CLOUD_STORAGE_BUCKET=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/CLOUD_STORAGE_BUCKET" -H "Metadata-Flavor: Google")
115 |
116 | # 從元數據服務獲取 MODEL_NAME,如果未設置則使用默認值
117 | MODEL_NAME=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/MODEL_NAME" -H "Metadata-Flavor: Google")
118 |
119 |
120 | # 運行容器
121 | docker run -p 80:8080 -e PORT=8080 -e MODEL_NAME=$MODEL_NAME -e CLOUD_STORAGE_BUCKET=$CLOUD_STORAGE_BUCKET -d asia-east1-docker.pkg.dev/$PROJECT_ID/cxcxc-vertex-ai-demo/ai-app:0.0.1
122 |
123 | ```
124 | ### 4. 設定Metadata
125 | ```
126 | CLOUD_STORAGE_BUCKET=你要存放照片的桶子
127 | MODEL_NAME=gemini-1.5-flash-002
128 | ```
129 |
130 |
131 | ## 在cloud run 執行的方式
132 |
133 | ### 1. 建立Service account 或沿用先前的Service account
134 |
135 | 建立service account,並派發以下IAM Role
136 |
137 | ```
138 | Storage Admin
139 | Vertex AI User
140 | Artifact registry reader
141 | ```
142 |
143 | ### 2. 切換至cloud run 進行部屬
144 |
145 |
146 | 在建立過程中,環境變數記得要修改
147 |
148 | ```
149 | CLOUD_STORAGE_BUCKET=your-bucket-name
150 | MODEL_NAME=gemini-1.5-flash-002
151 | ```
152 |
--------------------------------------------------------------------------------
/gcp_vertex_ai/雲育鏈課程QA問答知識.csv:
--------------------------------------------------------------------------------
1 | user_question,official_answer
2 | 考雲端證照,有什麼用呢,"可以給公司作為政府標案的能力量化依據
3 | 可以作為自身能力的證明"
4 | 我想考GCP證照,應該從哪張開始入門呢,"GCP-ACE這張證照,雖然名字上有工程師
5 | 但是考試內容涵蓋了 預算、權限、網路、開發、維運
6 | 是很適合學員們了解GCP的課程"
7 | 我想考AWS證照,應該從哪張開始入門呢,"建議先上雲育鏈的經典架構實作課,對雲端有經驗之後
8 | 再上AWS解決方案架構師認證課。"
9 | AWS-SAA 這張證照要怎麼準備呢,"自學的話,可以去買大話AWS架構。
10 | 想要節省時間的話,可以去買一些外部課程
11 | 想要有真實師傅領進門的話,就來上雲育鏈的課程吧"
12 | 你們AI課都在教些什麼呢?,"* **課程內容:** 課程內容包含:
13 | * AI、ML 和生成式 AI 的基本概念和術語
14 | * 人工智慧、機器學習和生成式人工智慧的用例
15 | * 基礎模型的設計注意事項
16 | * 模型訓練與微調
17 | * 及時工程
18 | * 基礎模型評價標準
19 | * 負責任的人工智慧
20 | * 人工智慧系統的安全性和合規性
21 | * 將業務流程打造成一個 AI-Agent
22 | * 利用多重 AI-Agent 完成複雜任務流,強化 AI 產出品質
23 | * 引導同仁資料共享與上雲的 – Google Sheet
24 | * 打造 AI 分身的必要關鍵 – Appscript
25 | * 台灣最火爆的 Line 官方號運維 – Line Official Account"
26 | AI的課程,會需要寫程式嗎?,"現在已經可以讓AI幫我們寫很精準的程式了
27 | 只要能夠很好地讓他了解我們的業務流程
28 | 而我們這門課即將帶您了解AI-Agent,知道如何高效地讓他完成任務。"
29 | 我是一個非資訊業的人士,想要跨足到雲端產業,該怎麼做呢?,把時間專注學習,好好念書,上秉鴻老師的課。
30 | AWS-Sysops課程在教什麼呢?,"引領學員掌握AWS雲端維運技術,強調實作與理論知識的結合,目的在於全面提升學員的雲端技術實力。鑒於SOA課程調性,我們建議學員在參加本課程前,先完成 AWS認證解決方案架構師考證班 的學習,以確保有堅實的基礎。
31 |
32 | 以情境式的專案實作進行課程,課程結束可建置出一個產品。
33 | 以資訊業界常用的維運情境,呼應AWS核心服務的知識要點。
34 | 針對不同維運情境,而設計出來的實作Lab,紮根強化技術能力。
35 | 會有兩次的題型解析,剖析考題內的維運要點,精準答題。"
36 | 雲育鏈的課程跟外面的課程有什麼差別呢?,"秉鴻老師是兼具產業界、學界、補教業的前輩
37 | 從工程師、資料科學、商業規劃、專案管理、標案申請等均有經驗
38 |
39 | 上課也會先用人類世界案例,引起同學思想之後,再做類比,之後總結。
40 | 課後還會有餐會,連結眾人的社會關係。"
41 | 課程會不會很難?導致我聽不懂?,"可以到任一課程的官網頁面最下方看同學評論
42 |
43 | https://www.cxcxc.io/aws-solution-architect-course/
44 |
45 | 謝謝秉鴻老師上課幽默風趣的言談 用人類世界的生活來解釋對比複雜雲端世界 淺顯易懂也更加深刻印象!對於變化中的雲端資訊技術也一直應變更新!獲益良多!謝謝
46 |
47 | 老師的 AWS SAA 課程真的是非常出色!他能把原本有點枯燥的技術概念講解得既清晰又有趣,讓學習變得輕鬆許多。老師對 AWS 的理解非常深厚,不僅知識紮實,還能很有效地傳遞給學生。雲育鍊老師的教學方式讓我們能夠輕鬆掌握關鍵概念和實戰技巧。同時,他也很樂於解答問題,給出的建議和實例都非常實用。這堂課我給予滿分評價,推薦給所有想深入了解 AWS 的學習者!"
48 | 我想報名AWS-SAA課程,"## AWS雲端解決方案架構師考證班 - 雲育鏈 | AWS雲端培訓合作夥伴 | 雲端課程培訓
49 |
50 | 課程內容為最新認證版本【 SAA-C03 】
51 | 可順利考取 AWS Solutions Architect – Associate 認證(SAA-C03),並具有充足理論與實戰經驗,能因應各IT部門的專案需求及雲端代理商的案件,設計出專案中客戶所需的雲端架構,提出可行的雲端解決方案。
52 |
53 | 先以生活化的故事方式旁徵博引,牽引至技術面做深入的探討。
54 | 以資訊業界常用的架構為主,帶出AWS核心服務的重點內容。
55 | 課程針對各服務精準介紹、案例考題加強印象,整體考題練習。
56 | 每單元上完立即練習,增加考照記憶點,並透過雲端認證小幫手練習。
57 |
58 | **課程時間:**
59 | 詳見報名連結
60 | https://lihi1.com/OSdQi
61 |
62 | **上課地點:**
63 |
64 | * 台北市中山區長安東路二段80號5樓 (近松江南京捷運站4號出口)
65 | * 在家遠端直播上課
66 |
67 | **多種在雲端上常見的架構延伸討論:**
68 |
69 | **加入LINE官方號,詢問課程內容**
70 |
71 | https://lin.ee/27OG8ZS"
72 | 我想報名GCP-ACE課程,"## GCP 雲端工程師實作考證班 - 雲育鏈 | AWS雲端培訓合作夥伴 | 雲端課程培訓
73 |
74 | 本課程將以NIST新方向的雲概念進行實作,當中以「零信任安全」及「雲端原生」技術,貫穿整個GCP雲端架構的思路,結訓後具備考取GCP Cloud Engineer認證的資格與實力。
75 |
76 | 主要考的都是NIST新方向的雲概念,老師也會在裡面放入多種強化元素:
77 |
78 | * 部署應用程式
79 | * 監控運維
80 | * 管理企業解決方案
81 | * 使用Console和CLI來進行開發及運維
82 | * 設計並實作企業應用場景的雲端架構
83 | * 透過架構設計提出解決方案
84 |
85 | **課程時間:**
86 | 查看下方連結
87 | https://lihi1.com/MJf3i
88 |
89 | **上課地點:**
90 |
91 | * 台北市中山區長安東路二段80號5樓 (近松江南京捷運站4號出口)
92 | * 在家遠端直播上課
93 |
94 | **更多架構與實作Lab:**
95 |
96 | 以架構思維進行系統設計的培訓,除了學習雲端技術實作外,更是在系統設計思路。剖析各種不同應用場景的架構,並以實作的方式解決。
97 |
98 | **加入LINE官方號,詢問課程內容**
99 |
100 | https://lin.ee/27OG8ZS
101 | "
102 | 請問你們有專人可以服務嗎?,"**加入LINE官方號**
103 |
104 | https://lin.ee/27OG8ZS
105 |
106 | 加入之後記得傳張貼圖,我們才能知道喔"
107 | 你們有提供企業包班服務嗎?,"有的,可以加入LINE官方號
108 | https://lin.ee/27OG8ZS
109 |
110 | 裡面有專人跟您洽談企業包班細節,加入之後記得傳張貼圖,我們才能知道喔"
111 | 我們公司想要上雲,你們這邊可以怎麼幫忙我們?,"每一間公司的企業文化都有不同,會建議找顧問進行討論,設計一個逐步引導的過程
112 | 可以加入LINE官方號
113 | https://lin.ee/27OG8ZS
114 |
115 | 裡面有專人跟您洽談顧問細節,加入之後記得傳張貼圖,我們才能知道喔"
116 | 我們公司雲端費用很貴,該怎麼辦?,"雲端節費是我們公司的強項,您可以選擇上課了解各類服務的節費方向,或聯絡我們,替您安排顧問。
117 | 可以加入LINE官方號
118 | https://lin.ee/27OG8ZS
119 |
120 | 裡面有專人跟您洽談顧問細節,加入之後記得傳張貼圖,我們才能知道喔"
121 | 你們這裡有教室場地租借嗎?,"有的,可以聯絡專人,確認場地可行的租借時間。
122 |
123 | 一個時段是1600元,當月最優惠,預訂上午+下午時段只要3000$ !!
124 |
125 | 相關網址如下
126 | https://www.cxcxc.io/space-rental/"
127 | 你們公司在哪裡啊?,"台北據點是長安東路二段80號5樓
128 | 中壢是明德路60號四樓
129 | 來訪前,建議先打電話詢問是否在辦公室喔, 電話是02-25078554"
130 | 要如何聯絡到李秉鴻老師呢?,"可以加入LINE官方號,由我們替您安排聯絡喔
131 | https://lin.ee/27OG8ZS"
132 | 我想要團報課程,有人可以幫我嗎?,"可以加入LINE官方號,由我們替您安排聯絡喔
133 | https://lin.ee/27OG8ZS"
134 |
--------------------------------------------------------------------------------
/gcp_vertex_ai/app.py:
--------------------------------------------------------------------------------
1 | from flask import Flask, request, render_template, jsonify
2 | import os
3 | import base64
4 | from datetime import datetime
5 | from google.cloud import storage
6 | import vertexai
7 | from vertexai.generative_models import GenerativeModel, Part, SafetySetting
8 |
9 |
10 | app = Flask(__name__)
11 |
12 | # 填入你為llm補上的記憶
13 | text1 = """ """
14 |
15 | # 設定上傳檔案的目錄
16 | UPLOAD_FOLDER = 'uploads'
17 | os.makedirs(UPLOAD_FOLDER, exist_ok=True)
18 | app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
19 |
20 | # 初始化 Vertex AI
21 | vertexai.init(location="asia-east1")
22 |
23 | # 取得 Cloud Storage bucket 名稱
24 | BUCKET_NAME = os.environ.get('CLOUD_STORAGE_BUCKET')
25 |
26 | # 模型名稱,從環境變數取得,若無則使用預設值
27 | MODEL_NAME = os.environ.get('MODEL_NAME', "gemini-1.5-flash-002")
28 |
29 | # Vertex AI 的配置
30 | generation_config = {
31 | "max_output_tokens": 8192,
32 | "temperature": 1,
33 | "top_p": 0.95,
34 | }
35 |
36 | safety_settings = [
37 | SafetySetting(
38 | category=SafetySetting.HarmCategory.HARM_CATEGORY_HATE_SPEECH,
39 | threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH
40 | ),
41 | SafetySetting(
42 | category=SafetySetting.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
43 | threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH
44 | ),
45 | SafetySetting(
46 | category=SafetySetting.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
47 | threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH
48 | ),
49 | SafetySetting(
50 | category=SafetySetting.HarmCategory.HARM_CATEGORY_HARASSMENT,
51 | threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH
52 | ),
53 | ]
54 |
55 | @app.route('/')
56 | def index():
57 | return render_template('index.html')
58 |
59 |
60 | @app.route('/chat', methods=['POST'])
61 | def chat():
62 | user_message = request.form.get('message')
63 | image_base64 = request.form.get('image_base64') # 從請求中獲取 Base64 圖片
64 |
65 | if not user_message:
66 | return jsonify({'error': '必須提供文字訊息'}), 400
67 |
68 | # 處理圖片資料,如果有的話
69 | if image_base64:
70 | # 將 Base64 字串轉換為二進位資料
71 | image_data = base64.b64decode(image_base64)
72 |
73 | # 將圖片儲存到 Cloud Storage
74 | try:
75 | image_url = save_image_to_bucket(image_data)
76 | conversation_history_entry = f"你上傳了一張圖片: {image_url}"
77 | except Exception as e:
78 | return jsonify({'error': f'圖片儲存失敗: {str(e)}'}), 500
79 |
80 | # 創建 Part 對象以包含圖片資料
81 | image_part = Part.from_data(
82 | mime_type="image/png", # 可以根據實際檔案類型調整
83 | data=image_data
84 | )
85 | # 將文字訊息與圖片的 Part 物件一起作為輸入
86 | combined_input = [text1, user_message, image_part]
87 | else:
88 | # 如果沒有圖片,僅使用文字訊息
89 | combined_input = [text1, user_message]
90 |
91 | # 使用 Vertex AI 生成回應
92 | try:
93 | model = GenerativeModel(MODEL_NAME)
94 | responses = model.generate_content(
95 | combined_input,
96 | generation_config=generation_config,
97 | safety_settings=safety_settings,
98 | stream=True,
99 | )
100 |
101 | # 取得生成的回應
102 | response_message = ""
103 | for response in responses:
104 | response_message += response.text
105 | except Exception as e:
106 | return jsonify({'error': str(e)}), 500
107 |
108 | return jsonify({'message': response_message})
109 |
110 | def save_image_to_bucket(image_data):
111 | """將圖片儲存到指定的 Cloud Storage bucket,並返回圖片的公開 URL"""
112 | # 初始化 Cloud Storage 客戶端
113 | client = storage.Client()
114 | bucket = client.bucket(BUCKET_NAME)
115 |
116 | # 取得當前日期和時間
117 | current_datetime = datetime.utcnow()
118 | date_folder = current_datetime.strftime('%Y-%m-%d')
119 | filename = current_datetime.strftime('%Y-%m-%d-%H-%M-%S') + '.jpg'
120 |
121 | # 建立儲存路徑
122 | blob_path = f"{date_folder}/{filename}"
123 | blob = bucket.blob(blob_path)
124 |
125 | # 將圖片上傳到 Cloud Storage
126 | blob.upload_from_string(image_data, content_type='image/jpeg')
127 |
128 | # 設置 blob 為公開可讀
129 | blob.make_public()
130 |
131 | # 返回公開的 URL
132 | return blob.public_url
133 |
134 | if __name__ == '__main__':
135 | app.run(debug=True,port=5000)
136 |
--------------------------------------------------------------------------------
/iam_adv.md:
--------------------------------------------------------------------------------
1 | # Step1 本地用戶使用gcloud
2 |
3 | #### 登入AWS Console 充當本地機器
4 |
5 | https://cxcxc-learning.signin.aws.amazon.com/console
6 |
7 | 帳密:課程時詢問老師
8 |
9 | 啟用aws版本的CloudShell,並在裡面安裝Google的CloudSDK
10 |
11 | #### 輸入指令編輯,遠端套件庫
12 | ```
13 | sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM
14 |
15 | ```
16 |
17 | #### 更新遠端套件庫網址
18 | ```
19 | [google-cloud-sdk]
20 | name=Google Cloud SDK
21 | baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el7-x86_64
22 | enabled=1
23 | gpgcheck=1
24 | repo_gpgcheck=1
25 | gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
26 | https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
27 | EOM
28 | ```
29 |
30 | #### 安裝 CloudSDK 與 python套件
31 | ```
32 | sudo yum install -y google-cloud-sdk
33 | sudo pip3 install google-cloud-storage
34 | ```
35 |
36 | #### 在AWS CloudShell 內登入
37 | 輸入後,會彈跳出連結,要求我方使用google驗證,以現有管理員登入
38 | ```
39 | gcloud auth application-default login --no-launch-browser
40 | gcloud config set project {YOUR-PROJECT-ID}
41 | export GCLOUD_PROJECT={YOUR-PROJECT-ID}
42 | ```
43 |
44 | #### 啟用python3命令
45 | ```
46 | python3
47 | ```
48 |
49 | #### 輸入list bucket的python相關語句
50 |
51 | ```
52 | from google.cloud import storage
53 |
54 | # 啟用客戶端
55 | storage_client = storage.Client()
56 |
57 | # 調度瀏覽功能
58 | buckets = storage_client.list_buckets()
59 |
60 | # 打印桶子
61 | for bucket in buckets:
62 | print(bucket.name)
63 |
64 | ```
65 |
66 | #### 江湖一點訣,點破不值錢
67 | ```
68 | # 該些credential暫存在家目錄內 (~/.config/gcloud/application_default_credentials.json)
69 | ls ~/.config/gcloud/
70 |
71 | ```
72 |
73 |
74 | # Step2 - 允許本地用戶可調度專案內的所有Service account
75 |
76 | 重新安裝一個新的AWS Cloud Shell
77 |
78 | 原因是先前登入方式,是GCP不建議的,
79 | ```
80 | # 不樂見
81 | # gcloud auth application-default login
82 | ```
83 |
84 | #### 輸入指令編輯,遠端套件庫
85 | ```
86 | sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM
87 |
88 | ```
89 | #### 更新遠端套件庫網址
90 | ```
91 | [google-cloud-sdk]
92 | name=Google Cloud SDK
93 | baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el7-x86_64
94 | enabled=1
95 | gpgcheck=1
96 | repo_gpgcheck=1
97 | gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
98 | https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
99 | EOM
100 | ```
101 |
102 | #### 安裝 CloudSDK 與 python套件
103 | ```
104 | sudo yum install -y google-cloud-sdk
105 | sudo pip3 install google-cloud-storage
106 | ```
107 |
108 | #### 登入新用戶
109 | ```
110 | gcloud auth login
111 | gcloud config set project {YOUR-PROJECT-ID}
112 | ```
113 |
114 | #### 為新用戶追加權限
115 |
116 | 他希望我們Member都透過service account 調度服務
117 |
118 | 為新的IAM User設置 可調度service account的role,Service Account User 與 Token Creator兩個權限。
119 |
120 | 登入新的IAM User,並輸入指令,要求透過先前建置的service account調度gcloud storage
121 |
122 | #### 調度SERVICE_ACCOUNT@XXXX.XX的權限去操作cloud storage
123 | ```
124 | gsutil -i SERVICE_ACCOUNT@XXXX.XX ls gs://YOUR-BUCKET-NAME/
125 | ```
126 |
127 | #### 調度其他的Service account 試試,發現權限開得很大,什麼Service account 都能調用
128 |
129 |
130 |
131 | # Step3 - 允許用戶使用 特定Service account
132 |
133 |
134 | 取消先前用戶可調度Service account的權限,並切換至IAM的服務帳戶功能列
135 |
136 | 點擊特定服務帳戶,進行編輯,追加用戶的email
137 |
138 | 並選擇Service account使用者權限,進行儲存
139 |
140 |
141 | #### 調度SERVICE_ACCOUNT@XXXX.XX的權限去操作cloud storage
142 | ```
143 | gsutil -i SERVICE_ACCOUNT@XXXX.XX ls gs://YOUR-BUCKET-NAME/
144 | ```
145 |
146 | 發現成功,同學也可以趁此刻去調度其他服務帳戶的權限,看是不是會有反應。
147 |
148 |
149 | # Step4 - 本地經常性調度Service account
150 |
151 | ### 經常性調度Service account
152 |
153 | 先前的使用方法,適用於臨時查閱雲端資源,但若我們希望經常使用service account,而不需特別指名 -i
154 |
155 | 可先切換回IAM Console,為該Service account生成 json檔
156 |
157 | 在本地端激活,後續可直接如一般調用GCP指令
158 | ```
159 | # 在本地認證該service account,並透過其json檔調度資源
160 | gcloud auth activate-service-account SERVICE-ACCOUNT-NAME --key-file=service-account.json
161 |
162 | # 訪問桶子
163 | gsutil ls gs://YOUR-BUCKET-NAME/
164 | ```
165 |
166 | ## 上面的方式適用於命令列,若還要在本地進行開發,則需將該service-account.json,放置合適位置,並依照下方方式配置
167 |
168 | #### 設定環境變數
169 | ```
170 | export GOOGLE_APPLICATION_CREDENTIALS="[OUR-SERVICE-ACCOUNT-JSON-PATH]"
171 |
172 | sudo pip3 install google-cloud-storage
173 |
174 | python3
175 | ```
176 |
177 | #### 透過python結合service account調度資料
178 | 啟用python3做service account操作
179 | ```
180 | from google.cloud import storage
181 | # 發現其可行
182 | storage_client = storage.Client()
183 | buckets = storage_client.list_buckets()
184 | for bucket in buckets:
185 | print(bucket.name)
186 | ```
187 |
188 | # Step5 OS-Login
189 |
190 | 這已經算是一個複合式的Lab了。
191 |
192 | #### 開一台GCE Instance
193 |
194 | 記錄下該台GCE Instance 所使用的Service account
195 |
196 | #### 在該台instance的 metadata內,追加允許os login
197 |
198 | ```
199 | enable-oslogin: TRUE
200 | ```
201 |
202 | #### 切換回IAM Console,針對用戶授與權限
203 |
204 | 追加新用戶入帳號內,追加秉鴻的email好了。
205 |
206 | 並授與權限
207 |
208 | ```
209 | Compute OS Login or Compute OS Admin Login
210 | Compute Viewer
211 | IAP-secured Tunnel User (可連線到沒有公有IP的機器)
212 | ```
213 |
214 | #### 切換至Service account 管理畫面
215 |
216 | 找出該台GCE Instance所使用的Service account
217 |
218 | 授與秉鴻的email 可以操作該Service account的權限
219 |
220 | ```
221 | Service Account User
222 | ```
223 |
224 |
225 |
--------------------------------------------------------------------------------
/gcp_vertex_ai/qa_converted.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "inputs": [
4 | "考雲端證照,有什麼用呢"
5 | ],
6 | "outputs": [
7 | "可以給公司作為政府標案的能力量化依據\n可以作為自身能力的證明"
8 | ]
9 | },
10 | {
11 | "inputs": [
12 | "我想考GCP證照,應該從哪張開始入門呢"
13 | ],
14 | "outputs": [
15 | "GCP-ACE這張證照,雖然名字上有工程師\n但是考試內容涵蓋了 預算、權限、網路、開發、維運\n是很適合學員們了解GCP的課程"
16 | ]
17 | },
18 | {
19 | "inputs": [
20 | "我想考AWS證照,應該從哪張開始入門呢"
21 | ],
22 | "outputs": [
23 | "建議先上雲育鏈的經典架構實作課,對雲端有經驗之後\n再上AWS解決方案架構師認證課。"
24 | ]
25 | },
26 | {
27 | "inputs": [
28 | "AWS-SAA 這張證照要怎麼準備呢"
29 | ],
30 | "outputs": [
31 | "自學的話,可以去買大話AWS架構。\n想要節省時間的話,可以去買一些外部課程\n想要有真實師傅領進門的話,就來上雲育鏈的課程吧"
32 | ]
33 | },
34 | {
35 | "inputs": [
36 | "你們AI課都在教些什麼呢?"
37 | ],
38 | "outputs": [
39 | "* **課程內容:** 課程內容包含:\n * AI、ML 和生成式 AI 的基本概念和術語\n * 人工智慧、機器學習和生成式人工智慧的用例\n * 基礎模型的設計注意事項\n * 模型訓練與微調\n * 及時工程\n * 基礎模型評價標準\n * 負責任的人工智慧\n * 人工智慧系統的安全性和合規性\n * 將業務流程打造成一個 AI-Agent\n * 利用多重 AI-Agent 完成複雜任務流,強化 AI 產出品質\n * 引導同仁資料共享與上雲的 – Google Sheet\n * 打造 AI 分身的必要關鍵 – Appscript\n * 台灣最火爆的 Line 官方號運維 – Line Official Account"
40 | ]
41 | },
42 | {
43 | "inputs": [
44 | "AI的課程,會需要寫程式嗎?"
45 | ],
46 | "outputs": [
47 | "現在已經可以讓AI幫我們寫很精準的程式了\n只要能夠很好地讓他了解我們的業務流程\n而我們這門課即將帶您了解AI-Agent,知道如何高效地讓他完成任務。"
48 | ]
49 | },
50 | {
51 | "inputs": [
52 | "我是一個非資訊業的人士,想要跨足到雲端產業,該怎麼做呢?"
53 | ],
54 | "outputs": [
55 | "把時間專注學習,好好念書,上秉鴻老師的課。"
56 | ]
57 | },
58 | {
59 | "inputs": [
60 | "AWS-Sysops課程在教什麼呢?"
61 | ],
62 | "outputs": [
63 | "引領學員掌握AWS雲端維運技術,強調實作與理論知識的結合,目的在於全面提升學員的雲端技術實力。鑒於SOA課程調性,我們建議學員在參加本課程前,先完成 AWS認證解決方案架構師考證班 的學習,以確保有堅實的基礎。\n\n以情境式的專案實作進行課程,課程結束可建置出一個產品。\n以資訊業界常用的維運情境,呼應AWS核心服務的知識要點。\n針對不同維運情境,而設計出來的實作Lab,紮根強化技術能力。\n會有兩次的題型解析,剖析考題內的維運要點,精準答題。"
64 | ]
65 | },
66 | {
67 | "inputs": [
68 | "雲育鏈的課程跟外面的課程有什麼差別呢?"
69 | ],
70 | "outputs": [
71 | "秉鴻老師是兼具產業界、學界、補教業的前輩\n從工程師、資料科學、商業規劃、專案管理、標案申請等均有經驗\n\n上課也會先用人類世界案例,引起同學思想之後,再做類比,之後總結。\n課後還會有餐會,連結眾人的社會關係。"
72 | ]
73 | },
74 | {
75 | "inputs": [
76 | "課程會不會很難?導致我聽不懂?"
77 | ],
78 | "outputs": [
79 | "可以到任一課程的官網頁面最下方看同學評論\n\nhttps://www.cxcxc.io/aws-solution-architect-course/\n\n謝謝秉鴻老師上課幽默風趣的言談 用人類世界的生活來解釋對比複雜雲端世界 淺顯易懂也更加深刻印象!對於變化中的雲端資訊技術也一直應變更新!獲益良多!謝謝\n\n老師的 AWS SAA 課程真的是非常出色!他能把原本有點枯燥的技術概念講解得既清晰又有趣,讓學習變得輕鬆許多。老師對 AWS 的理解非常深厚,不僅知識紮實,還能很有效地傳遞給學生。雲育鍊老師的教學方式讓我們能夠輕鬆掌握關鍵概念和實戰技巧。同時,他也很樂於解答問題,給出的建議和實例都非常實用。這堂課我給予滿分評價,推薦給所有想深入了解 AWS 的學習者!"
80 | ]
81 | },
82 | {
83 | "inputs": [
84 | "我想報名AWS-SAA課程"
85 | ],
86 | "outputs": [
87 | "## AWS雲端解決方案架構師考證班 - 雲育鏈 | AWS雲端培訓合作夥伴 | 雲端課程培訓\n\n課程內容為最新認證版本【 SAA-C03 】\n可順利考取 AWS Solutions Architect – Associate 認證(SAA-C03),並具有充足理論與實戰經驗,能因應各IT部門的專案需求及雲端代理商的案件,設計出專案中客戶所需的雲端架構,提出可行的雲端解決方案。\n\n先以生活化的故事方式旁徵博引,牽引至技術面做深入的探討。\n以資訊業界常用的架構為主,帶出AWS核心服務的重點內容。\n課程針對各服務精準介紹、案例考題加強印象,整體考題練習。\n每單元上完立即練習,增加考照記憶點,並透過雲端認證小幫手練習。\n\n**課程時間:**\n詳見報名連結\nhttps://lihi1.com/OSdQi\n\n**上課地點:**\n\n* 台北市中山區長安東路二段80號5樓 (近松江南京捷運站4號出口)\n* 在家遠端直播上課\n\n**多種在雲端上常見的架構延伸討論:**\n\n**加入LINE官方號,詢問課程內容**\n\nhttps://lin.ee/27OG8ZS"
88 | ]
89 | },
90 | {
91 | "inputs": [
92 | "我想報名GCP-ACE課程"
93 | ],
94 | "outputs": [
95 | "## GCP 雲端工程師實作考證班 - 雲育鏈 | AWS雲端培訓合作夥伴 | 雲端課程培訓\n\n本課程將以NIST新方向的雲概念進行實作,當中以「零信任安全」及「雲端原生」技術,貫穿整個GCP雲端架構的思路,結訓後具備考取GCP Cloud Engineer認證的資格與實力。\n\n主要考的都是NIST新方向的雲概念,老師也會在裡面放入多種強化元素:\n\n* 部署應用程式\n* 監控運維\n* 管理企業解決方案\n* 使用Console和CLI來進行開發及運維\n* 設計並實作企業應用場景的雲端架構\n* 透過架構設計提出解決方案\n\n**課程時間:**\n查看下方連結\nhttps://lihi1.com/MJf3i\n\n**上課地點:**\n\n* 台北市中山區長安東路二段80號5樓 (近松江南京捷運站4號出口)\n* 在家遠端直播上課\n\n**更多架構與實作Lab:**\n\n以架構思維進行系統設計的培訓,除了學習雲端技術實作外,更是在系統設計思路。剖析各種不同應用場景的架構,並以實作的方式解決。\n\n**加入LINE官方號,詢問課程內容**\n\nhttps://lin.ee/27OG8ZS\n"
96 | ]
97 | },
98 | {
99 | "inputs": [
100 | "請問你們有專人可以服務嗎?"
101 | ],
102 | "outputs": [
103 | "**加入LINE官方號**\n\nhttps://lin.ee/27OG8ZS\n\n加入之後記得傳張貼圖,我們才能知道喔"
104 | ]
105 | },
106 | {
107 | "inputs": [
108 | "你們有提供企業包班服務嗎?"
109 | ],
110 | "outputs": [
111 | "有的,可以加入LINE官方號\nhttps://lin.ee/27OG8ZS\n\n裡面有專人跟您洽談企業包班細節,加入之後記得傳張貼圖,我們才能知道喔"
112 | ]
113 | },
114 | {
115 | "inputs": [
116 | "我們公司想要上雲,你們這邊可以怎麼幫忙我們?"
117 | ],
118 | "outputs": [
119 | "每一間公司的企業文化都有不同,會建議找顧問進行討論,設計一個逐步引導的過程\n可以加入LINE官方號\nhttps://lin.ee/27OG8ZS\n\n裡面有專人跟您洽談顧問細節,加入之後記得傳張貼圖,我們才能知道喔"
120 | ]
121 | },
122 | {
123 | "inputs": [
124 | "我們公司雲端費用很貴,該怎麼辦?"
125 | ],
126 | "outputs": [
127 | "雲端節費是我們公司的強項,您可以選擇上課了解各類服務的節費方向,或聯絡我們,替您安排顧問。\n可以加入LINE官方號\nhttps://lin.ee/27OG8ZS\n\n裡面有專人跟您洽談顧問細節,加入之後記得傳張貼圖,我們才能知道喔"
128 | ]
129 | },
130 | {
131 | "inputs": [
132 | "你們這裡有教室場地租借嗎?"
133 | ],
134 | "outputs": [
135 | "有的,可以聯絡專人,確認場地可行的租借時間。\n\n一個時段是1600元,當月最優惠,預訂上午+下午時段只要3000$ !!\n\n相關網址如下\nhttps://www.cxcxc.io/space-rental/"
136 | ]
137 | },
138 | {
139 | "inputs": [
140 | "你們公司在哪裡啊?"
141 | ],
142 | "outputs": [
143 | "台北據點是長安東路二段80號5樓\n中壢是明德路60號四樓\n來訪前,建議先打電話詢問是否在辦公室喔, 電話是02-25078554"
144 | ]
145 | },
146 | {
147 | "inputs": [
148 | "要如何聯絡到李秉鴻老師呢?"
149 | ],
150 | "outputs": [
151 | "可以加入LINE官方號,由我們替您安排聯絡喔\nhttps://lin.ee/27OG8ZS"
152 | ]
153 | },
154 | {
155 | "inputs": [
156 | "我想要團報課程,有人可以幫我嗎?"
157 | ],
158 | "outputs": [
159 | "可以加入LINE官方號,由我們替您安排聯絡喔\nhttps://lin.ee/27OG8ZS"
160 | ]
161 | }
162 | ]
--------------------------------------------------------------------------------
/gcp_vertex_ai/app_with_similar_tune.py:
--------------------------------------------------------------------------------
1 | from flask import Flask, request, render_template, jsonify
2 | import os
3 | import base64
4 | from datetime import datetime
5 | from google.cloud import storage
6 | import vertexai
7 | from vertexai.generative_models import GenerativeModel, Part, SafetySetting
8 |
9 |
10 | app = Flask(__name__)
11 |
12 | text1 = """input: 考雲端證照,有什麼用呢
13 | output: 可以給公司作為政府標案的能力量化依據
14 | 可以作為自身能力的證明
15 |
16 | input: 我想考GCP證照,應該從哪張開始入門呢
17 | output: GCP-ACE這張證照,雖然名字上有工程師
18 | 但是考試內容涵蓋了 預算、權限、網路、開發、維運
19 | 是很適合學員們了解GCP的課程
20 |
21 | input: 我想考AWS證照,應該從哪張開始入門呢
22 | output: 建議先上雲育鏈的經典架構實作課,對雲端有經驗之後
23 | 再上AWS解決方案架構師認證課。
24 |
25 | input: AWS-SAA 這張證照要怎麼準備呢
26 | output: 自學的話,可以去買大話AWS架構。
27 | 想要節省時間的話,可以去買一些外部課程
28 | 想要有真實師傅領進門的話,就來上雲育鏈的課程吧
29 |
30 | input: 你們AI課都在教些什麼呢?
31 | output: * **課程內容:** 課程內容包含:
32 | * AI、ML 和生成式 AI 的基本概念和術語
33 | * 人工智慧、機器學習和生成式人工智慧的用例
34 | * 基礎模型的設計注意事項
35 | * 模型訓練與微調
36 | * 及時工程
37 | * 基礎模型評價標準
38 | * 負責任的人工智慧
39 | * 人工智慧系統的安全性和合規性
40 | * 將業務流程打造成一個 AI-Agent
41 | * 利用多重 AI-Agent 完成複雜任務流,強化 AI 產出品質
42 | * 引導同仁資料共享與上雲的 – Google Sheet
43 | * 打造 AI 分身的必要關鍵 – Appscript
44 | * 台灣最火爆的 Line 官方號運維 – Line Official Account
45 |
46 | input: AI的課程,會需要寫程式嗎?
47 | output: 現在已經可以讓AI幫我們寫很精準的程式了
48 | 只要能夠很好地讓他了解我們的業務流程
49 | 而我們這門課即將帶您了解AI-Agent,知道如何高效地讓他完成任務。
50 |
51 | input: 我是一個非資訊業的人士,想要跨足到雲端產業,該怎麼做呢?
52 | output: 把時間專注學習,好好念書,上秉鴻老師的課。
53 |
54 | input: AWS-Sysops課程在教什麼呢?
55 | output: 引領學員掌握AWS雲端維運技術,強調實作與理論知識的結合,目的在於全面提升學員的雲端技術實力。鑒於SOA課程調性,我們建議學員在參加本課程前,先完成 AWS認證解決方案架構師考證班 的學習,以確保有堅實的基礎。
56 |
57 | 以情境式的專案實作進行課程,課程結束可建置出一個產品。
58 | 以資訊業界常用的維運情境,呼應AWS核心服務的知識要點。
59 | 針對不同維運情境,而設計出來的實作Lab,紮根強化技術能力。
60 | 會有兩次的題型解析,剖析考題內的維運要點,精準答題。
61 |
62 | input: 雲育鏈的課程跟外面的課程有什麼差別呢?
63 | output: 秉鴻老師是兼具產業界、學界、補教業的前輩
64 | 從工程師、資料科學、商業規劃、專案管理、標案申請等均有經驗
65 |
66 | 上課也會先用人類世界案例,引起同學思想之後,再做類比,之後總結。
67 | 課後還會有餐會,連結眾人的社會關係。
68 |
69 | input: 課程會不會很難?導致我聽不懂?
70 | output: 可以到任一課程的官網頁面最下方看同學評論
71 |
72 | https://www.cxcxc.io/aws-solution-architect-course/
73 |
74 | 謝謝秉鴻老師上課幽默風趣的言談 用人類世界的生活來解釋對比複雜雲端世界 淺顯易懂也更加深刻印象!對於變化中的雲端資訊技術也一直應變更新!獲益良多!謝謝
75 |
76 | 老師的 AWS SAA 課程真的是非常出色!他能把原本有點枯燥的技術概念講解得既清晰又有趣,讓學習變得輕鬆許多。老師對 AWS 的理解非常深厚,不僅知識紮實,還能很有效地傳遞給學生。雲育鍊老師的教學方式讓我們能夠輕鬆掌握關鍵概念和實戰技巧。同時,他也很樂於解答問題,給出的建議和實例都非常實用。這堂課我給予滿分評價,推薦給所有想深入了解 AWS 的學習者!
77 |
78 | input: 我想報名AWS-SAA課程
79 | output: ## AWS雲端解決方案架構師考證班 - 雲育鏈 | AWS雲端培訓合作夥伴 | 雲端課程培訓
80 |
81 | 課程內容為最新認證版本【 SAA-C03 】
82 | 可順利考取 AWS Solutions Architect – Associate 認證(SAA-C03),並具有充足理論與實戰經驗,能因應各IT部門的專案需求及雲端代理商的案件,設計出專案中客戶所需的雲端架構,提出可行的雲端解決方案。
83 |
84 | 先以生活化的故事方式旁徵博引,牽引至技術面做深入的探討。
85 | 以資訊業界常用的架構為主,帶出AWS核心服務的重點內容。
86 | 課程針對各服務精準介紹、案例考題加強印象,整體考題練習。
87 | 每單元上完立即練習,增加考照記憶點,並透過雲端認證小幫手練習。
88 |
89 | **課程時間:**
90 | 詳見報名連結
91 | https://lihi1.com/OSdQi
92 |
93 | **上課地點:**
94 |
95 | * 台北市中山區長安東路二段80號5樓 (近松江南京捷運站4號出口)
96 | * 在家遠端直播上課
97 |
98 | **多種在雲端上常見的架構延伸討論:**
99 |
100 | **加入LINE官方號,詢問課程內容**
101 |
102 | https://lin.ee/27OG8ZS
103 |
104 | input: 我想報名GCP-ACE課程
105 | output: ## GCP 雲端工程師實作考證班 - 雲育鏈 | AWS雲端培訓合作夥伴 | 雲端課程培訓
106 |
107 | 本課程將以NIST新方向的雲概念進行實作,當中以「零信任安全」及「雲端原生」技術,貫穿整個GCP雲端架構的思路,結訓後具備考取GCP Cloud Engineer認證的資格與實力。
108 |
109 | 主要考的都是NIST新方向的雲概念,老師也會在裡面放入多種強化元素:
110 |
111 | * 部署應用程式
112 | * 監控運維
113 | * 管理企業解決方案
114 | * 使用Console和CLI來進行開發及運維
115 | * 設計並實作企業應用場景的雲端架構
116 | * 透過架構設計提出解決方案
117 |
118 | **課程時間:**
119 | 查看下方連結
120 | https://lihi1.com/MJf3i
121 |
122 | **上課地點:**
123 |
124 | * 台北市中山區長安東路二段80號5樓 (近松江南京捷運站4號出口)
125 | * 在家遠端直播上課
126 |
127 | **更多架構與實作Lab:**
128 |
129 | 以架構思維進行系統設計的培訓,除了學習雲端技術實作外,更是在系統設計思路。剖析各種不同應用場景的架構,並以實作的方式解決。
130 |
131 | **加入LINE官方號,詢問課程內容**
132 |
133 | https://lin.ee/27OG8ZS
134 |
135 |
136 | input: 請問你們有專人可以服務嗎?
137 | output: **加入LINE官方號**
138 |
139 | https://lin.ee/27OG8ZS
140 |
141 | 加入之後記得傳張貼圖,我們才能知道喔
142 |
143 | input: 你們有提供企業包班服務嗎?
144 | output: 有的,可以加入LINE官方號
145 | https://lin.ee/27OG8ZS
146 |
147 | 裡面有專人跟您洽談企業包班細節,加入之後記得傳張貼圖,我們才能知道喔
148 |
149 | input: 我們公司想要上雲,你們這邊可以怎麼幫忙我們?
150 | output: 每一間公司的企業文化都有不同,會建議找顧問進行討論,設計一個逐步引導的過程
151 | 可以加入LINE官方號
152 | https://lin.ee/27OG8ZS
153 |
154 | 裡面有專人跟您洽談顧問細節,加入之後記得傳張貼圖,我們才能知道喔
155 |
156 | input: 我們公司雲端費用很貴,該怎麼辦?
157 | output: 雲端節費是我們公司的強項,您可以選擇上課了解各類服務的節費方向,或聯絡我們,替您安排顧問。
158 | 可以加入LINE官方號
159 | https://lin.ee/27OG8ZS
160 |
161 | 裡面有專人跟您洽談顧問細節,加入之後記得傳張貼圖,我們才能知道喔
162 |
163 | input: 你們這裡有教室場地租借嗎?
164 | output: 有的,可以聯絡專人,確認場地可行的租借時間。
165 |
166 | 一個時段是1600元,當月最優惠,預訂上午+下午時段只要3000$ !!
167 |
168 | 相關網址如下
169 | https://www.cxcxc.io/space-rental/
170 |
171 | input: 你們公司在哪裡啊?
172 | output: 台北據點是長安東路二段80號5樓
173 | 中壢是明德路60號四樓
174 | 來訪前,建議先打電話詢問是否在辦公室喔, 電話是02-25078554
175 |
176 | input: 要如何聯絡到李秉鴻老師呢?
177 | output: 可以加入LINE官方號,由我們替您安排聯絡喔
178 | https://lin.ee/27OG8ZS
179 |
180 | input: 我想要團報課程,有人可以幫我嗎?
181 | output: 可以加入LINE官方號,由我們替您安排聯絡喔
182 | https://lin.ee/27OG8ZS"""
183 |
184 | # 設定上傳檔案的目錄
185 | UPLOAD_FOLDER = 'uploads'
186 | os.makedirs(UPLOAD_FOLDER, exist_ok=True)
187 | app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
188 |
189 | # 初始化 Vertex AI
190 | vertexai.init(location="asia-east1")
191 |
192 | # 取得 Cloud Storage bucket 名稱
193 | BUCKET_NAME = os.environ.get('CLOUD_STORAGE_BUCKET')
194 |
195 | # 模型名稱,從環境變數取得,若無則使用預設值
196 | MODEL_NAME = os.environ.get('MODEL_NAME', "projects/904506393037/locations/asia-east1/endpoints/9016721025437532160")
197 |
198 | # Vertex AI 的配置
199 | generation_config = {
200 | "max_output_tokens": 8192,
201 | "temperature": 1,
202 | "top_p": 0.95,
203 | }
204 |
205 | safety_settings = [
206 | SafetySetting(
207 | category=SafetySetting.HarmCategory.HARM_CATEGORY_HATE_SPEECH,
208 | threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH
209 | ),
210 | SafetySetting(
211 | category=SafetySetting.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
212 | threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH
213 | ),
214 | SafetySetting(
215 | category=SafetySetting.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
216 | threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH
217 | ),
218 | SafetySetting(
219 | category=SafetySetting.HarmCategory.HARM_CATEGORY_HARASSMENT,
220 | threshold=SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH
221 | ),
222 | ]
223 |
224 | @app.route('/')
225 | def index():
226 | return render_template('index.html')
227 |
228 |
229 | @app.route('/chat', methods=['POST'])
230 | def chat():
231 | user_message = request.form.get('message')
232 | image_base64 = request.form.get('image_base64') # 從請求中獲取 Base64 圖片
233 |
234 | if not user_message:
235 | return jsonify({'error': '必須提供文字訊息'}), 400
236 |
237 | # 處理圖片資料,如果有的話
238 | if image_base64:
239 | # 將 Base64 字串轉換為二進位資料
240 | image_data = base64.b64decode(image_base64)
241 |
242 | # 將圖片儲存到 Cloud Storage
243 | try:
244 | image_url = save_image_to_bucket(image_data)
245 | conversation_history_entry = f"你上傳了一張圖片: {image_url}"
246 | except Exception as e:
247 | return jsonify({'error': f'圖片儲存失敗: {str(e)}'}), 500
248 |
249 | # 創建 Part 對象以包含圖片資料
250 | image_part = Part.from_data(
251 | mime_type="image/png", # 可以根據實際檔案類型調整
252 | data=image_data
253 | )
254 | # 將文字訊息與圖片的 Part 物件一起作為輸入
255 | combined_input = [text1, user_message, image_part]
256 | else:
257 | # 如果沒有圖片,僅使用文字訊息
258 | combined_input = [text1, user_message]
259 |
260 | # 使用 Vertex AI 生成回應
261 | try:
262 | model = GenerativeModel(MODEL_NAME)
263 | responses = model.generate_content(
264 | combined_input,
265 | generation_config=generation_config,
266 | safety_settings=safety_settings,
267 | stream=True,
268 | )
269 |
270 | # 取得生成的回應
271 | response_message = ""
272 | for response in responses:
273 | response_message += response.text
274 | except Exception as e:
275 | return jsonify({'error': str(e)}), 500
276 |
277 | return jsonify({'message': response_message})
278 |
279 | def save_image_to_bucket(image_data):
280 | """將圖片儲存到指定的 Cloud Storage bucket,並返回圖片的公開 URL"""
281 | # 初始化 Cloud Storage 客戶端
282 | client = storage.Client()
283 | bucket = client.bucket(BUCKET_NAME)
284 |
285 | # 取得當前日期和時間
286 | current_datetime = datetime.utcnow()
287 | date_folder = current_datetime.strftime('%Y-%m-%d')
288 | filename = current_datetime.strftime('%Y-%m-%d-%H-%M-%S') + '.jpg'
289 |
290 | # 建立儲存路徑
291 | blob_path = f"{date_folder}/{filename}"
292 | blob = bucket.blob(blob_path)
293 |
294 | # 將圖片上傳到 Cloud Storage
295 | blob.upload_from_string(image_data, content_type='image/jpeg')
296 |
297 | # 設置 blob 為公開可讀
298 | blob.make_public()
299 |
300 | # 返回公開的 URL
301 | return blob.public_url
302 |
303 | if __name__ == '__main__':
304 | app.run(debug=True,port=5000)
305 |
--------------------------------------------------------------------------------