Amazon ECS Linux 컨테이너 인스턴스를 시작할 때 스크립트 실행하기
Amazon ECS Linux 컨테이너 인스턴스를 시작할 때 스크립트 실행하기
모니터링, 보안, 메트릭, 서비스 디스커버리, 로깅 같은 운영 또는 보안 문제를 처리하기 위해, 모든 컨테이너 인스턴스에서 특정 컨테이너를 실행해야 할 수 있어요. 이를 위해 시작 시 user data 스크립트로 docker run 명령을 호출하도록 컨테이너 인스턴스를 구성하거나, Upstart나 systemd 같은 init 시스템을 사용할 수 있습니다.
출처: 문서
본문
모니터링, 보안, 메트릭, 서비스 디스커버리, 로깅 같은 운영 또는 보안 문제를 처리하려면 모든 컨테이너 인스턴스에서 특정 컨테이너를 실행해야 할 수 있습니다. 이렇게 하려면 시작 시 user data 스크립트로 docker run 명령을 호출하도록 컨테이너 인스턴스를 구성하거나, Upstart나 systemd 같은 init 시스템을 사용할 수 있어요.
이 방법은 작동하지만 단점이 있습니다. Amazon ECS가 컨테이너를 알지 못하고 CPU, 메모리, 포트나 다른 리소스를 모니터링할 수 없기 때문입니다. Amazon ECS가 모든 태스크 리소스를 제대로 계산하도록 하려면, 컨테이너 인스턴스에서 실행할 컨테이너에 대한 태스크 정의를 만들고, Amazon EC2 user data로 시작 시점에 Amazon ECS가 태스크를 배치하도록 하세요.
다음 절차의 Amazon EC2 user data 스크립트는 Amazon ECS 인트로스펙션(introspection) API를 사용해 컨테이너 인스턴스를 식별합니다. 그런 다음 AWS CLI와 start-task 명령을 사용해 시작 중에 지정된 태스크를 자기 자신에서 실행합니다.
컨테이너 인스턴스 시작 시 태스크 시작하기
ecsInstanceRoleIAM 역할을 수정해StartTaskAPI 작업에 대한 권한을 추가합니다. 자세한 내용은 AWS Identity and Access Management User Guide의 "Update permissions for a role"을 참고하세요.- Amazon ECS-optimized Amazon Linux 2 AMI로 하나 이상의 컨테이너 인스턴스를 시작합니다. 새 컨테이너 인스턴스를 시작하고 EC2 User data에 다음 예제 스크립트를 사용하세요.
your_cluster_name을 컨테이너 인스턴스가 등록할 클러스터로,my_task_def를 시작 시 인스턴스에서 실행할 태스크 정의로 바꿔 주세요. 자세한 내용은 "Launching an Amazon ECS Linux container instance"를 참고하세요.
참고: 다음 MIME 멀티파트 콘텐츠는 셸 스크립트로 구성 값을 설정하고 패키지를 설치합니다. 또한 systemd 작업으로 ecs 서비스가 실행되고 인트로스펙션 API를 사용할 수 있게 된 후에 태스크를 시작합니다.
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 에서 엽니다.
- 내비게이션 바에서 클러스터가 있는 Region을 선택합니다.
- 탐색 창에서 Clusters를 선택하고 컨테이너 인스턴스를 호스팅하는 클러스터를 선택합니다.
- Cluster 페이지에서 Tasks를 선택한 다음 태스크를 선택합니다. 시작한 각 컨테이너 인스턴스에 태스크가 실행 중이어야 합니다.
- 태스크가 보이지 않으면 SSH로 컨테이너 인스턴스에 로그인해 디버깅 정보를 위해
/var/log/ecs/ecs-start-task.log파일을 확인하세요.
더 알아보기 (Learn more)
- Amazon ECS Linux 컨테이너 인스턴스 시작에 대한 자세한 내용은 AWS 공식 문서를 참고해 주세요.