🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付

11/22 20:40更新: 忘記更新 Dockerfile,已經反映了🙏

Amazon ECS的新功能「快展模式」正式推出。

只要將容器映像壓入ECR,即可輕鬆自動構建ECS周邊的基礎設施,而無需準備繁瑣的網路和任務定義等。

快展模式要點總結

  • 需自行將映像壓入ECR
  • 在創建嚮導中,如果不更改詳細設定則將部署至預設的VPC
  • 同樣地,如果不更改,ALB和任務會被配置在公共子網路中
  • 執行環境為Fargate。由於是x86架構,因此在Mac上構建時需注意
  • 刪除服務後,會統一清理自動創建的資源

以往的挑戰

特別是在使用Streamlit開發像Bedrock等AI聊天機器人時,需要使用支持WebSocket的基礎設施,因此無法使用AWS App Runner等便捷部署方式是之前的挑戰。

然而,自行構建ECS對於初學者來說是一個不小的門檻。
由於並非像App Runner那樣無伺服器,因此在部署後會持續產生運行成本。
(根據配置情況,每月大約幾千元是最小的?)

1. 建立Docker映像

ECS快展模式遺憾的是需要自己構建Docker映像。
希望能像App Runner或Amplify一樣支持GitHub的倉庫綁定…!

本次操作將僅使用AWS美國維吉尼亞北部區域。

創建ECR倉庫

以擁有足夠權限的IAM使用者身份登錄AWS帳戶,並搜索reg以訪問Amazon ECR。

從首頁的「創建」按鈕創建新的私有倉庫。
倉庫名稱設為simple-streamlit-chatbot,其他保持預設即可。

啟動容器構建用的開發環境

雖然努力想使用AWS CloudShell,但因為磁碟只有1GB無法執行,所以決定安分使用本地PC或GitHub Codespaces等。

接下來,將以simple-streamlit-chatbot這個名稱創建新的公共倉庫。
記得開啟Add README

啟動代碼空間。

安裝AWS CLI的最新版本。

# 下載安裝程序
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

# 解壓安裝程序
unzip awscliv2.zip

# 執行安裝程序
sudo ./aws/install

# 刪除不必要的檔案
rm -rf awscliv2.zip aws

從終端驗證以便能操作自己的AWS帳戶。

aws login --remote

雖然已經被廣泛使用,但這也是新功能。
https://aws.amazon.com/jp/blogs/security/simplified-developer-access-to-aws-with-aws-login/

當出現AWS Region [us-east-1]:的提示時,按Enter進入預設設定。

然後,訪問顯示的URL,並使用當前工作AWS帳戶進行瀏覽器驗證,然後複製驗證碼並粘貼到代碼空間的終端。

創建Streamlit應用

從代碼空間的左側邊欄創建以下新Python檔案。

app.py

import asyncio
import streamlit as st
from strands import Agent
from strands.tools.mcp import MCPClient
from mcp import stdio_client, StdioServerParameters

# 繪製前端
st.title("Strands MCP代理")
st.text("使用AWS知識MCP伺服器,Nova Premier將回答您的問題!")
prompt = st.chat_input("輸入問題")

if prompt:
    # 顯示用戶提示
    with st.chat_message("user"):
        st.markdown(prompt)

    # 顯示代理的回應
    with st.chat_message("assistant"):
        with st.spinner("思考中…"):

            # 創建MCP客戶端
            client = MCPClient(lambda: stdio_client(
                StdioServerParameters(
                    command="uvx",
                    args=["awslabs.aws-documentation-mcp-server@latest"]
                )
            ))

            with client:
                # 創建代理
                agent = Agent(
                    model="us.amazon.nova-premier-v1:0",
                    system_prompt="請使用日語進行思考和回答。",
                    tools=client.list_tools_sync()
                )

                # 準備流式顯示
                container = st.container()
                state = {
                    "text_holder": container.empty(),
                    "buffer": "",
                    "shown_tools": set()
                }

                # 定義非同步函數以進行Strands流式執行
                async def run_stream():
                    async for event in agent.stream_async(prompt):
                        current_tool = event.get('current_tool_use', {})
                        tool_id = current_tool.get('toolUseId')
                        tool_name = current_tool.get('name')

                        # 檢測並顯示工具的執行
                        if tool_id and tool_name and tool_id not in state["shown_tools"]:
                            state["shown_tools"].add(tool_id)
                            if state["buffer"]:
                                state["text_holder"].markdown(state["buffer"])
                                state["buffer"] = ""
                            container.info(f"🔧 **{tool_name}** 工具正在執行中...")
                            state["text_holder"] = container.empty()

                        # 提取並顯示文本
                        if event.get('data'):
                            state["buffer"] += event['data']
                            state["text_holder"].markdown(state["buffer"] + "▌")

                    # 最終顯示
                    if state["buffer"]:
                        state["text_holder"].markdown(state["buffer"])

                # 執行非同步函數
                asyncio.run(run_stream())

同樣,創建容器化所需的Dockerfile。

Dockerfile

FROM python:3.13

# 工作目錄
WORKDIR /app

# 安裝依賴包
RUN pip install uv mcp streamlit strands-agents strands-agents-tools

# 複製應用本體
COPY . /app

# 公開端口
EXPOSE 80

# 啟動Streamlit
CMD ["streamlit", "run", "app.py", "--server.port=80", "--server.address=0.0.0.0"]

創建並註冊容器映像

打開之前的ECR倉庫,可以從「顯示推送命令」按鈕中找到所需的命令。

在代碼空間上依次執行這些命令,即可完成推送。

2. 使用ECS快展模式進行部署

訪問ECS控制台,通過「立即開始」按鈕打開快展模式嚮導。

選擇之前註冊的映像的latest標籤。

兩個角色選擇「創建新角色」的下拉選項。
ecsTaskExecutionRoleecsInfrastructureRoleForExpressServices將自動創建)

展開「其他設定」,點擊任務角色的「創建新角色」。
將對Bedrock有訪問權限的權限設置為ECS任務。

在步驟1中,選擇用例中的ECS任務並進行下一步。

勾選許可政策AmazonBedrockFullAccess,然後繼續。

創建名為ecsTaskExecutionRoleWithBedrock的角色。

返回ECS快展模式創建畫面,點擊任務角色旁的「更新」圖示後,指定剛創建的角色。

然後,按下「創建」按鈕,開始基礎設施的建構。

約6分鐘後部署將完成。

從畫面上方的「應用程序URL」可以訪問Streamlit應用。由於此URL即將使用,因此請複製下來。

此時,應用已經公開於互聯網,需注意。如果不實作後續的認證畫面而中途停下,則可能會被不特定的用戶使用。

3. 添加Cognito認證

創建用戶池

訪問Amazon Cognito菜單,點擊「在5分鐘內免費開始」。

僅更改以下預設。

  • 為應用命名:simple-streamlit-chatbot
  • 登錄識別符選項:勾選「郵件地址」
  • 註冊所需屬性:選擇「email」
  • 返回URL:輸入剛創建的ECS應用的「應用程序URL」+ /oauth2/idpresponse(例如:https://xxx.ecs.us-east-1.on.aws/oauth2/idpresponse

在ALB中設置Cognito認證

從ECS快展模式創建的服務的「資源」標籤中,跳轉至ALB聆聽器。

編輯優先順序為「1」的聆聽器規則,增加以下規則。

  • 預處理路由行動:認證用戶
  • 身份提供者:Amazon Cognito
  • 用戶池ID:選擇剛創建的
  • 用戶池客戶端ID:simple-streamlit-chatbot
  • 目標組:確認上述的目標組名稱

然後繼續並保存。

修改安全組

為了在認證完成後可以通過ALB訪問Cognito的認證端點,需要在安全組中新增出站規則。

點擊聆聽器規則上方的「負載均衡器」以轉至ALB。
然後,從「安全性」標籤中點擊安全組ID。

轉至「出站規則」標籤,然後編輯「出站規則」。
從「添加規則」按鈕新增以下規則。

  • 類型:HTTPS
  • 目標:Anywhare-IPv4

驗證功能

這樣一來,便可以使用認證從「應用程序URL」訪問Streamlit應用!

請實際試用。

如果想要刪除應用,只需從管理控制台刪除ECS服務,即可統一刪除快展模式創建的一系列資源,非常方便!

附錄

如果通過本次步驟入門ECS和Cognito,歡迎參考以下書籍,創建並部署更方便的AI代理💪


原文出處:https://qiita.com/minorun365/items/7ad6c37eb8996e79d631


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝16   💬10   ❤️5
421
🥈
我愛JS
📝2   💬8   ❤️4
94
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付