11/22 20:40更新: 忘記更新 Dockerfile,已經反映了🙏
Amazon ECS的新功能「快展模式」正式推出。
只要將容器映像壓入ECR,即可輕鬆自動構建ECS周邊的基礎設施,而無需準備繁瑣的網路和任務定義等。
特別是在使用Streamlit開發像Bedrock等AI聊天機器人時,需要使用支持WebSocket的基礎設施,因此無法使用AWS App Runner等便捷部署方式是之前的挑戰。
然而,自行構建ECS對於初學者來說是一個不小的門檻。
由於並非像App Runner那樣無伺服器,因此在部署後會持續產生運行成本。
(根據配置情況,每月大約幾千元是最小的?)
ECS快展模式遺憾的是需要自己構建Docker映像。
希望能像App Runner或Amplify一樣支持GitHub的倉庫綁定…!
本次操作將僅使用AWS美國維吉尼亞北部區域。
以擁有足夠權限的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帳戶進行瀏覽器驗證,然後複製驗證碼並粘貼到代碼空間的終端。
從代碼空間的左側邊欄創建以下新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倉庫,可以從「顯示推送命令」按鈕中找到所需的命令。
在代碼空間上依次執行這些命令,即可完成推送。
訪問ECS控制台,通過「立即開始」按鈕打開快展模式嚮導。
選擇之前註冊的映像的latest標籤。
兩個角色選擇「創建新角色」的下拉選項。
(ecsTaskExecutionRole和ecsInfrastructureRoleForExpressServices將自動創建)
展開「其他設定」,點擊任務角色的「創建新角色」。
將對Bedrock有訪問權限的權限設置為ECS任務。
在步驟1中,選擇用例中的ECS任務並進行下一步。
勾選許可政策AmazonBedrockFullAccess,然後繼續。
創建名為ecsTaskExecutionRoleWithBedrock的角色。
返回ECS快展模式創建畫面,點擊任務角色旁的「更新」圖示後,指定剛創建的角色。
然後,按下「創建」按鈕,開始基礎設施的建構。
約6分鐘後部署將完成。
從畫面上方的「應用程序URL」可以訪問Streamlit應用。由於此URL即將使用,因此請複製下來。
此時,應用已經公開於互聯網,需注意。如果不實作後續的認證畫面而中途停下,則可能會被不特定的用戶使用。
訪問Amazon Cognito菜單,點擊「在5分鐘內免費開始」。
僅更改以下預設。
simple-streamlit-chatbot/oauth2/idpresponse(例如:https://xxx.ecs.us-east-1.on.aws/oauth2/idpresponse)從ECS快展模式創建的服務的「資源」標籤中,跳轉至ALB聆聽器。
編輯優先順序為「1」的聆聽器規則,增加以下規則。
simple-streamlit-chatbot然後繼續並保存。
為了在認證完成後可以通過ALB訪問Cognito的認證端點,需要在安全組中新增出站規則。
點擊聆聽器規則上方的「負載均衡器」以轉至ALB。
然後,從「安全性」標籤中點擊安全組ID。
轉至「出站規則」標籤,然後編輯「出站規則」。
從「添加規則」按鈕新增以下規則。
這樣一來,便可以使用認證從「應用程序URL」訪問Streamlit應用!
請實際試用。
如果想要刪除應用,只需從管理控制台刪除ECS服務,即可統一刪除快展模式創建的一系列資源,非常方便!
如果通過本次步驟入門ECS和Cognito,歡迎參考以下書籍,創建並部署更方便的AI代理💪
原文出處:https://qiita.com/minorun365/items/7ad6c37eb8996e79d631