

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 啟動 Amazon ECS Linux 容器執行個體時執行指令碼
<a name="start_task_at_launch"></a>

您可能需要在每個容器執行個體上執行特定的容器，以處理營運或安全性相關事項，例如監控、安全性、指標、服務探索或記錄。

若要執行此作業，您可以將您的容器執行個體設定為在啟動時或在某些 init 系統中 (例如 Upstart 或 **systemd**)，以使用者資料指令碼呼叫 **docker run** 命令。雖然此方法可行，但有一些缺點，因為 Amazon ECS 對容器一無所知，也無法監控 CPU、記憶體、連接埠或任何其他使用的資源。為確保 Amazon ECS 可正確說明所有任務資源，請為在您容器執行個體上執行的容器建立任務定義。然後，使用 Amazon ECS，利用 Amazon EC2 使用者資料在啟動時放置任務。

下列程序中的 Amazon EC2 使用者資料指令碼會使用 Amazon ECS 自我檢查 API 來識別容器執行個體。然後，它會使用 AWS CLI 和 **start-task**命令在啟動期間自行執行指定的任務。

**在容器執行個體啟動階段啟動任務**

1. 修改您的 `ecsInstanceRole` IAM 角色，新增 `StartTask` API 操作的許可。如需詳細資訊，請參閱 *AWS Identity and Access Management User Guide* 中的 [Update permissions for a role](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_update-role-permissions.html)。

1. 使用 Amazon ECS 最佳化 Amazon Linux 2 AMI 啟動一或多個容器執行個體。啟動新的容器執行個體，並在 EC2 使用者資料中使用如下範例指令碼。將 *your\$1cluster\$1name* 取代為容器執行個體要註冊的目標叢集，並將 *my\$1task\$1def* 取代為要在啟動時於執行個體上執行的任務定義。

   如需詳細資訊，請參閱[啟動 Amazon ECS Linux 容器執行個體](launch_container_instance.md)。
**注意**  
以下的 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==--
   ```

1. 確認您的容器執行個體在正確的叢集中啟動，而且您的任務已啟動。

   1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

   1. 從導覽列選擇您叢集所在的區域。

   1. 在導覽窗格中選擇 **Clusters** (叢集)，並選取託管您容器執行個體的叢集。

   1. 在**叢集**頁面上，選擇**任務**，然後選擇您的任務。

      您啟動的每個容器執行個體都應該有任務在正在其中執行。

      如果您沒有看到您的任務，您可以使用 SSH 登入您的容器執行個體，檢查 `/var/log/ecs/ecs-start-task.log` 檔案的偵錯資訊。