本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
啟動 Amazon ECS Linux 容器執行個體時執行指令碼
您可能需要在每個容器執行個體上執行特定容器,以處理操作或安全問題,例如監控、安全性、指標、服務探索或記錄。
若要執行此作業,您可以將您的容器執行個體設定為在啟動時或在某些 init 系統中 (例如 Upstart 或 systemd),以使用者資料指令碼呼叫 docker run 命令。雖然此方法可行,但有一些缺點,因為 Amazon ECS 對容器一無所知,也無法監控 CPU、記憶體、連接埠或任何其他使用的資源。為確保 Amazon ECS 可正確說明所有任務資源,請為在您容器執行個體上執行的容器建立任務定義。然後,使用 Amazon ECS,利用 Amazon EC2 使用者資料在啟動時放置任務。
下列程序中的 Amazon EC2 使用者資料指令碼會使用 Amazon ECS 自我檢查 API 來識別容器執行個體。然後,它會使用 AWS CLI 和 start-task命令,在啟動期間自行執行指定的任務。
在容器執行個體啟動階段啟動任務
-
修改您的
ecsInstanceRole
IAM 角色,新增StartTask
API 操作的許可。如需詳細資訊,請參閱AWS Identity and Access Management 《 使用者指南》中的更新角色的許可。 -
使用 Amazon ECS 最佳化 Amazon Linux 2 AMI 啟動一或多個容器執行個體。啟動新的容器執行個體,並在 EC2 使用者資料中使用下列範例指令碼。將
your_cluster_name
取代為容器執行個體要註冊的叢集,並將my_task_def
取代為啟動時要在執行個體上執行的任務定義。如需詳細資訊,請參閱啟動 Amazon ECS Linux 容器執行個體。
注意
以下的 MIME 多分段內容使用 shell 指令碼來設定組態值並安裝套件。在 ecs 服務已執行,並可使用自我檢查 API 之後,還會使用 systemd 工作啟動任務。
Content-Type: multipart/mixed; boundary="==BOUNDARY==" MIME-Version: 1.0 --==BOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash # Specify the cluster that the container instance should register into cluster=
your_cluster_name
# Write the cluster configuration variable to the ecs.config file # (add any other configuration variables here also) echo ECS_CLUSTER=$cluster >> /etc/ecs/ecs.config START_TASK_SCRIPT_FILE="/etc/ecs/ecs-start-task.sh" cat <<- 'EOF' > ${START_TASK_SCRIPT_FILE} exec 2>>/var/log/ecs/ecs-start-task.log set -x # Install prerequisite tools yum install -y jq aws-cli # Wait for the ECS service to be responsive until curl -s http://localhost:51678/v1/metadata do sleep 1 done # Grab the container instance ARN and AWS Region from instance metadata instance_arn=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $NF}' ) cluster=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .Cluster' | awk -F/ '{print $NF}' ) region=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F: '{print $4}') # Specify the task definition to run at launch task_definition=my_task_def
# Run the AWS CLI start-task command to start your task on this container instance aws ecs start-task --cluster $cluster --task-definition $task_definition --container-instances $instance_arn --started-by $instance_arn --region $region EOF # Write systemd unit file UNIT="ecs-start-task.service" cat <<- EOF > /etc/systemd/system/${UNIT} [Unit] Description=ECS Start Task Requires=ecs.service After=ecs.service [Service] Restart=on-failure RestartSec=30 ExecStart=/usr/bin/bash ${START_TASK_SCRIPT_FILE} [Install] WantedBy=default.target EOF # Enable our ecs.service dependent service with `--no-block` to prevent systemd deadlock # See https://github.com/aws/amazon-ecs-agent/issues/1707 systemctl enable --now --no-block "${UNIT}" --==BOUNDARY==-- -
確認您的容器執行個體在正確的叢集中啟動,而且您的任務已啟動。
開啟主控台,網址為 https://console.aws.amazon.com/ecs/v2
。 -
從導覽列選擇您叢集所在的區域。
-
在導覽窗格中選擇 Clusters (叢集),並選取託管您容器執行個體的叢集。
-
在叢集頁面上,選擇任務,然後選擇您的任務。
您啟動的每個容器執行個體都應該有任務在正在其中執行。
如果您沒有看到您的任務,您可以使用 SSH 登入您的容器執行個體,檢查
/var/log/ecs/ecs-start-task.log
檔案的偵錯資訊。