Amazon ECS Linux 컨테이너 인스턴스를 시작할 때 스크립트 실행 - Amazon Elastic Container Service

Amazon ECS Linux 컨테이너 인스턴스를 시작할 때 스크립트 실행

모니터링, 보안, 지표, 서비스 검색 또는 로깅과 같은 작업 또는 보안 문제를 처리하기 위해 모든 컨테이너 인스턴스에서 특정 컨테이너를 실행해야 할 수도 있습니다.

이렇게 하려면 시작 시 사용자 데이터 스크립트와 함께 docker run 명령(또는 일부 init 시스템에서는 Upstart나 systemd 등)을 호출하도록 컨테이너 인스턴스를 구성하는 것입니다. 이 방법은 효과적이지만 몇 가지 단점도 있는데, 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사용 설명서의 역할 수정을 참조하세요.

  2. Amazon ECS 최적화 Amazon Linux 2 AMI를 사용하여 하나 이상의 컨테이너 인스턴스를 시작합니다. 새 컨테이너 인스턴스를 시작하고 EC2 사용자 데이터에서 다음 예제 스크립트를 사용합니다. your_cluster_name을 등록할 컨테이너 인스턴스의 클러스터로, my_task_def를 시작 시 인스턴스에서 실행할 태스크 정의로 바꿉니다.

    자세한 내용은 Amazon ECS Linux 컨테이너 인스턴스 시작 단원을 참조하십시오.

    참고

    아래의 MIME 멀티파트 콘텐츠는 셸 스크립트를 사용하여 구성 값을 설정하고 패키지를 설치합니다. 또한 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==--
  3. 컨테이너 인스턴스가 올바른 클러스터로 시작되고 태스크가 시작되었는지 확인합니다.

    1. https://console.aws.amazon.com/ecs/v2에서 콘솔을 엽니다.

    2. 탐색 모음에서 클러스터가 속한 리전을 선택합니다.

    3. 탐색 창에서 클러스터를 선택하고 컨테이너 인스턴스를 호스팅하는 클러스터를 선택합니다.

    4. Cluster(클러스터) 페이지에서 Tasks(작업)를 선택한 다음 작업을 선택합니다.

      실행한 각 컨테이너 인스턴스에서 작업이 실행 중이어야 합니다.

      작업이 보이지 않는 경우, SSH를 사용하여 컨테이너 인스턴스에 로그인하고 /var/log/ecs/ecs-start-task.log 파일에서 디버깅 정보를 확인할 수 있습니다.