

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# AWS FIS aws:ecs:task 작업 사용
<a name="ecs-task-actions"></a>

 **aws:ecs:task** 작업을 사용하여 Amazon ECS 태스크에 오류를 주입할 수 있습니다. Amazon EC2 및 Fargate 용량 유형이 지원됩니다.

 이러한 작업은 [AWS Systems Manager(SSM) 문서](actions-ssm-agent.html#fis-ssm-docs)를 사용하여 결함을 주입합니다. `aws:ecs:task` 작업을 사용하려면 Amazon Elastic Container Service(Amazon ECS) 태스크 정의에 SSM 에이전트가 있는 컨테이너를 추가해야 합니다. 컨테이너는 Amazon ECS 태스크를 SSM 서비스에서 관리형 인스턴스로 등록하는 [AWS FIS 정의 스크립트](#ecs-task-reference)를 실행합니다. 또한 이 스크립트는 태스크 메타데이터를 검색하여 관리형 인스턴스에 태그를 추가합니다. 설정을 통해 AWS FIS는 대상 작업을 확인할 수 있습니다. 이 단락의 내용은 아래 다이어그램의 **설정**에 해당합니다.

 를 대상으로 AWS FIS 실험을 실행하면 `aws:ecs:task` AWS AWS FIS 실험 템플릿에서 지정한 대상 Amazon ECS 작업을 리소스 태그를 사용하여 SSM 관리형 인스턴스 세트에 매핑합니다`ECS_TASK_ARN`. 이 태그 값은 SSM 문서가 실행되어야 하는 연결된 Amazon ECS 태스크의 ARN입니다. 이 단락의 내용은 아래 다이어그램의 **결함 주입**에 해당합니다.

 다음 다이어그램은 하나의 기존 컨테이너가 있는 태스크에 대한 설정 및 결함 주입을 보여줍니다.

![\[SSM 에이전트 컨테이너를 사용한 Amazon ECS 작업 결함 주입 설정을 보여주는 다이어그램\]](http://docs.aws.amazon.com/ko_kr/fis/latest/userguide/images/ecs-actions.png)


## 작업
<a name="supported-ecs-task-actions"></a>
+ [aws:ecs:task-cpu-stress](fis-actions-reference.md#task-cpu-stress)
+ [aws:ecs:task-io-stress](fis-actions-reference.md#task-io-stress)
+ [aws:ecs:task-kill-process](fis-actions-reference.md#task-kill-process)
+ [aws:ecs:task-network-blackhole-port](fis-actions-reference.md#task-network-blackhole-port)
+ [aws:ecs:task-network-latency](fis-actions-reference.md#task-network-latency)
+ [aws:ecs:task-network-packet-loss](fis-actions-reference.md#task-network-packet-loss)

## 제한 사항
<a name="ecs-task-limitations"></a>
+ 다음 작업은 병렬로 실행할 수 없습니다.
  + aws:ecs:task-network-blackhole-port
  + aws:ecs:task-network-latency
  + aws:ecs:task-network-packet-loss
+ Amazon ECS Exec을 활성화한 경우 이러한 작업을 사용하려면 먼저 비활성화해야 합니다.
+ SSM 문서 실행은 실험에 완료됨 상태가 있더라도 취소됨 상태일 수 있습니다. Amazon ECS 작업을 실행할 때 고객이 제공한 기간은 실험의 작업 기간과 Amazon EC2 Systems Manager(SSM) 문서 기간 모두에 사용됩니다. 작업이 시작된 후 SSM 문서가 실행되기까지 약간의 시간이 걸립니다. 따라서 지정된 작업 기간에 도달할 때까지 SSM 문서의 실행을 완료하는 데 몇 초가 남을 수 있습니다. 실험 작업 기간에 도달하면 작업이 중지되고 SSM 문서 실행이 취소됩니다. 결함 주입에 성공했습니다.

## 요구 사항
<a name="ecs-task-requirements"></a>
+  AWS FIS [실험 역할에](getting-started-iam-service-role.md) 다음 권한을 추가합니다.
  + `ecs:DescribeTasks`
  + `ssm:SendCommand`
  + `ssm:ListCommands`
  + `ssm:CancelCommand`
+ 다음 권한을 Amazon ECS [작업 IAM 역할](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)에 추가합니다.
  + `ssm:CreateActivation`
  + `ssm:AddTagsToResource`
  + `iam:PassRole`

  참고로 관리형 인스턴스 역할의 ARN을 `iam:PassRole`의 리소스로 지정할 수 있습니다.
+ Amazon ECS [작업 실행 IAM 역할](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html)을 생성하고 [AmazonECSTaskExecutionRolePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonECSTaskExecutionRolePolicy.html) 관리형 정책을 추가합니다.
+ 태스크 정의에서 환경 변수 `MANAGED_INSTANCE_ROLE_NAME`을 [관리형 인스턴스 역할](https://docs.aws.amazon.com/systems-manager/latest/userguide/hybrid-multicloud-service-role.html) 이름으로 설정합니다. 이 역할은 SSM에서 관리형 인스턴스로 등록된 태스크에 연결됩니다.
+ 관리형 인스턴스 역할에 다음 권한을 추가합니다.
  + `ssm:DeleteActivation`
  + `ssm:DeregisterManagedInstance`
+ 관리형 인스턴스 역할에 [AmazonSSMManagedInstanceCore](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonSSMManagedInstanceCore.html) 관리형 정책을 추가합니다.
+ Amazon ECS 태스크 정의에 SSM 에이전트 컨테이너를 추가합니다. 명령 스크립트는 Amazon ECS 작업을 관리형 인스턴스로 등록합니다.

  ```
  {
      "name": "amazon-ssm-agent",
      "image": "public.ecr.aws/amazon-ssm-agent/amazon-ssm-agent:latest",
      "cpu": 0,
      "links": [],
      "portMappings": [],
      "essential": false,
      "entryPoint": [],
      "command": [
          "/bin/bash",
          "-c",
          "set -e; dnf upgrade -y; dnf install jq procps awscli -y; term_handler() { echo \"Deleting SSM activation $ACTIVATION_ID\"; if ! aws ssm delete-activation --activation-id $ACTIVATION_ID --region $ECS_TASK_REGION; then echo \"SSM activation $ACTIVATION_ID failed to be deleted\" 1>&2; fi; MANAGED_INSTANCE_ID=$(jq -e -r .ManagedInstanceID /var/lib/amazon/ssm/registration); echo \"Deregistering SSM Managed Instance $MANAGED_INSTANCE_ID\"; if ! aws ssm deregister-managed-instance --instance-id $MANAGED_INSTANCE_ID --region $ECS_TASK_REGION; then echo \"SSM Managed Instance $MANAGED_INSTANCE_ID failed to be deregistered\" 1>&2; fi; kill -SIGTERM $SSM_AGENT_PID; }; trap term_handler SIGTERM SIGINT; if [[ -z $MANAGED_INSTANCE_ROLE_NAME ]]; then echo \"Environment variable MANAGED_INSTANCE_ROLE_NAME not set, exiting\" 1>&2; exit 1; fi; if ! ps ax | grep amazon-ssm-agent | grep -v grep > /dev/null; then if [[ -n $ECS_CONTAINER_METADATA_URI_V4 ]] ; then echo \"Found ECS Container Metadata, running activation with metadata\"; TASK_METADATA=$(curl \"${ECS_CONTAINER_METADATA_URI_V4}/task\"); ECS_TASK_AVAILABILITY_ZONE=$(echo $TASK_METADATA | jq -e -r '.AvailabilityZone'); ECS_TASK_ARN=$(echo $TASK_METADATA | jq -e -r '.TaskARN'); ECS_TASK_REGION=$(echo $ECS_TASK_AVAILABILITY_ZONE | sed 's/.$//'); ECS_TASK_AVAILABILITY_ZONE_REGEX='^(af|ap|ca|cn|eu|me|sa|us|us-gov)-(central|north|(north(east|west))|south|south(east|west)|east|west)-[0-9]{1}[a-z]{1}$'; if ! [[ $ECS_TASK_AVAILABILITY_ZONE =~ $ECS_TASK_AVAILABILITY_ZONE_REGEX ]]; then echo \"Error extracting Availability Zone from ECS Container Metadata, exiting\" 1>&2; exit 1; fi; ECS_TASK_ARN_REGEX='^arn:(aws|aws-cn|aws-us-gov):ecs:[a-z0-9-]+:[0-9]{12}:task/[a-zA-Z0-9_-]+/[a-zA-Z0-9]+$'; if ! [[ $ECS_TASK_ARN =~ $ECS_TASK_ARN_REGEX ]]; then echo \"Error extracting Task ARN from ECS Container Metadata, exiting\" 1>&2; exit 1; fi; CREATE_ACTIVATION_OUTPUT=$(aws ssm create-activation --iam-role $MANAGED_INSTANCE_ROLE_NAME --tags Key=ECS_TASK_AVAILABILITY_ZONE,Value=$ECS_TASK_AVAILABILITY_ZONE Key=ECS_TASK_ARN,Value=$ECS_TASK_ARN Key=FAULT_INJECTION_SIDECAR,Value=true --region $ECS_TASK_REGION); ACTIVATION_CODE=$(echo $CREATE_ACTIVATION_OUTPUT | jq -e -r .ActivationCode); ACTIVATION_ID=$(echo $CREATE_ACTIVATION_OUTPUT | jq -e -r .ActivationId); if ! amazon-ssm-agent -register -code $ACTIVATION_CODE -id $ACTIVATION_ID -region $ECS_TASK_REGION; then echo \"Failed to register with AWS Systems Manager (SSM), exiting\" 1>&2; exit 1; fi; amazon-ssm-agent & SSM_AGENT_PID=$!; wait $SSM_AGENT_PID; else echo \"ECS Container Metadata not found, exiting\" 1>&2; exit 1; fi; else echo \"SSM agent is already running, exiting\" 1>&2; exit 1; fi"
      ],
      "environment": [
          {
              "name": "MANAGED_INSTANCE_ROLE_NAME",
              "value": "SSMManagedInstanceRole"
          }
      ],
      "environmentFiles": [],
      "mountPoints": [],
      "volumesFrom": [],
      "secrets": [],
      "dnsServers": [],
      "dnsSearchDomains": [],
      "extraHosts": [],
      "dockerSecurityOptions": [],
      "dockerLabels": {},
      "ulimits": [],
      "logConfiguration": {},
      "systemControls": []
  }
  ```

  더 읽기 쉬운 스크립트 버전은 [스크립트의 참조 버전](#ecs-task-reference)을 참조하세요.
+  Amazon ECS 태스크 정의에서 `enableFaultInjection` 필드를 설정하여 Amazon ECS Fault Injection APIs를 활성화합니다.

  ```
  "enableFaultInjection": true,
  ```
+ Fargate 작업에서 `aws:ecs:task-network-blackhole-port``aws:ecs:task-network-latency`, 또는 `aws:ecs:task-network-packet-loss` 작업을 사용하는 경우 작업에 `useEcsFaultInjectionEndpoints` 파라미터가 로 설정되어 있어야 합니다`true`.
+ `aws:ecs:task-kill-process`, `aws:ecs:task-network-latency`, 또는 `aws:ecs:task-network-packet-loss` 작업을 사용하는 경우 Amazon ECS 태스크 정의는 `aws:ecs:task-network-blackhole-port`를 로 `pidMode` 설정해야 합니다`task`.
+ EC2 시작 유형의 태스크에서 `aws:ecs:task-network-blackhole-port``aws:ecs:task-network-latency`, 또는 `aws:ecs:task-network-packet-loss` 작업을 사용하는 경우 [태스크 정의의 네트워킹 옵션을](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html) `awsvpc` 또는 로 설정해야 합니다`host`.

## 스크립트의 참조 버전
<a name="ecs-task-reference"></a>

다음은 참조용으로 요구 사항 섹션에 있는 더 읽기 쉬운 버전의 스크립트입니다.

```
#!/usr/bin/env bash

# This is the activation script used to register ECS tasks as Managed Instances in SSM
# The script retrieves information form the ECS task metadata endpoint to add three tags to the Managed Instance
#  - ECS_TASK_AVAILABILITY_ZONE: To allow customers to target Managed Instances / Tasks in a specific Availability Zone
#  - ECS_TASK_ARN: To allow customers to target Managed Instances / Tasks by using the Task ARN
#  - FAULT_INJECTION_SIDECAR: To make it clear that the tasks were registered as managed instance for fault injection purposes. Value is always 'true'.
# The script will leave the SSM Agent running in the background
# When the container running this script receives a SIGTERM or SIGINT signal, it will do the following cleanup:
#  - Delete SSM activation
#  - Deregister SSM managed instance

set -e # stop execution instantly as a query exits while having a non-zero

dnf upgrade -y
dnf install jq procps awscli -y

term_handler() {
  echo "Deleting SSM activation $ACTIVATION_ID"
  if ! aws ssm delete-activation --activation-id $ACTIVATION_ID --region $ECS_TASK_REGION; then
    echo "SSM activation $ACTIVATION_ID failed to be deleted" 1>&2
  fi

  MANAGED_INSTANCE_ID=$(jq -e -r .ManagedInstanceID /var/lib/amazon/ssm/registration)
  echo "Deregistering SSM Managed Instance $MANAGED_INSTANCE_ID"
  if ! aws ssm deregister-managed-instance --instance-id $MANAGED_INSTANCE_ID --region $ECS_TASK_REGION; then
    echo "SSM Managed Instance $MANAGED_INSTANCE_ID failed to be deregistered" 1>&2
  fi

  kill -SIGTERM $SSM_AGENT_PID
}
trap term_handler SIGTERM SIGINT

# check if the required IAM role is provided
if [[ -z $MANAGED_INSTANCE_ROLE_NAME ]] ; then
  echo "Environment variable MANAGED_INSTANCE_ROLE_NAME not set, exiting" 1>&2
  exit 1
fi

# check if the agent is already running (it will be if ECS Exec is enabled)
if ! ps ax | grep amazon-ssm-agent | grep -v grep > /dev/null; then

  # check if ECS Container Metadata is available
  if [[ -n $ECS_CONTAINER_METADATA_URI_V4 ]] ; then

    # Retrieve info from ECS task metadata endpoint
    echo "Found ECS Container Metadata, running activation with metadata"
    TASK_METADATA=$(curl "${ECS_CONTAINER_METADATA_URI_V4}/task")
    ECS_TASK_AVAILABILITY_ZONE=$(echo $TASK_METADATA | jq -e -r '.AvailabilityZone')
    ECS_TASK_ARN=$(echo $TASK_METADATA | jq -e -r '.TaskARN')
    ECS_TASK_REGION=$(echo $ECS_TASK_AVAILABILITY_ZONE | sed 's/.$//')

    # validate ECS_TASK_AVAILABILITY_ZONE
    ECS_TASK_AVAILABILITY_ZONE_REGEX='^(af|ap|ca|cn|eu|me|sa|us|us-gov)-(central|north|(north(east|west))|south|south(east|west)|east|west)-[0-9]{1}[a-z]{1}$'
    if ! [[ $ECS_TASK_AVAILABILITY_ZONE =~ $ECS_TASK_AVAILABILITY_ZONE_REGEX ]] ; then
      echo "Error extracting Availability Zone from ECS Container Metadata, exiting" 1>&2
      exit 1
    fi

    # validate ECS_TASK_ARN
    ECS_TASK_ARN_REGEX='^arn:(aws|aws-cn|aws-us-gov):ecs:[a-z0-9-]+:[0-9]{12}:task/[a-zA-Z0-9_-]+/[a-zA-Z0-9]+$'
    if ! [[ $ECS_TASK_ARN =~ $ECS_TASK_ARN_REGEX ]] ; then
      echo "Error extracting Task ARN from ECS Container Metadata, exiting" 1>&2
      exit 1
    fi

    # Create activation tagging with Availability Zone and Task ARN
    CREATE_ACTIVATION_OUTPUT=$(aws ssm create-activation \
      --iam-role $MANAGED_INSTANCE_ROLE_NAME \
      --tags Key=ECS_TASK_AVAILABILITY_ZONE,Value=$ECS_TASK_AVAILABILITY_ZONE Key=ECS_TASK_ARN,Value=$ECS_TASK_ARN Key=FAULT_INJECTION_SIDECAR,Value=true \
      --region $ECS_TASK_REGION)

    ACTIVATION_CODE=$(echo $CREATE_ACTIVATION_OUTPUT | jq -e -r .ActivationCode)
    ACTIVATION_ID=$(echo $CREATE_ACTIVATION_OUTPUT | jq -e -r .ActivationId)

    # Register with AWS Systems Manager (SSM)
    if ! amazon-ssm-agent -register -code $ACTIVATION_CODE -id $ACTIVATION_ID -region $ECS_TASK_REGION; then
      echo "Failed to register with AWS Systems Manager (SSM), exiting" 1>&2
      exit 1
    fi

    # the agent needs to run in the background, otherwise the trapped signal
    # won't execute the attached function until this process finishes
    amazon-ssm-agent &
    SSM_AGENT_PID=$!

    # need to keep the script alive, otherwise the container will terminate
    wait $SSM_AGENT_PID

  else
    echo "ECS Container Metadata not found, exiting" 1>&2
    exit 1
  fi

else
  echo "SSM agent is already running, exiting" 1>&2
  exit 1
fi
```

## 실험 템플릿 예시
<a name="example-ecs-task-experiment-template"></a>

다음은 [aws:ecs:task-cpu-stress](fis-actions-reference.md#task-cpu-stress) 작업에 대한 예제 실험 템플릿입니다.

```
{
    "description": "Run CPU stress on the target ECS tasks",
    "targets": {
        "myTasks": {
            "resourceType": "aws:ecs:task",
            "resourceArns": [
                "arn:aws:ecs:us-east-1:111122223333:task/my-cluster/09821742c0e24250b187dfed8EXAMPLE"
            ],
            "selectionMode": "ALL"
        }
    },
    "actions": {
        "EcsTask-cpu-stress": {
            "actionId": "aws:ecs:task-cpu-stress",
            "parameters": {
                "duration": "PT1M"
            },
            "targets": {
                "Tasks": "myTasks"
            }
        }
    },
    "stopConditions": [
        {
            "source": "none",
        }
    ],
    "roleArn": "arn:aws:iam::111122223333:role/fis-experiment-role",
    "tags": {}
}
```