AWS FIS aws:ecs:task 작업을 사용하세요. - AWS Fault Injection Service

AWS FIS aws:ecs:task 작업을 사용하세요.

aws:ecs:task 작업을 사용하여 Amazon ECS 태스크에 오류를 주입할 수 있습니다.

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

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

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

Diagram showing ECS task setup and fault injection process with containers and AWS FIS.

작업

제한 사항

  • 다음 작업은 AWS Fargate에서 사용할 수 없습니다.

    • aws:ecs:task-kill-process

    • aws:ecs:task-network-blackhole-port

    • aws:ecs:task-network-latency

    • aws:ecs:task-network-packet-loss

  • 다음 작업은 병렬로 실행할 수 없습니다.

    • aws:ecs:task-network-blackhole-port

    • aws:ecs:task-network-latency

    • aws:ecs:task-network-packet-loss

  • ECS Exec을 활성화한 경우, 이 작업을 사용할 수 있으려면 이 기능을 먼저 비활성화해야 합니다.

  • SSM 문서 실행은 실험에 완료됨 상태가 있더라도 취소됨 상태일 수 있습니다. ECS 작업을 실행할 때 고객이 제공한 기간은 실험의 작업 기간과 Amazon Systems Manager(SSM) 문서 기간 모두에 사용됩니다. 작업이 시작된 후 SSM 문서가 실행되기까지 약간의 시간이 걸립니다. 따라서 지정된 작업 기간에 도달할 때까지 SSM 문서의 실행을 완료하는 데 몇 초가 남을 수 있습니다. 실험 작업 기간에 도달하면 작업이 중지되고 SSM 문서 실행이 취소됩니다. 결함 주입에 성공했습니다.

요구 사항

  • AWS FIS 실험 역할에 다음 권한을 추가합니다.

    • ssm:SendCommand

    • ssm:ListCommands

    • ssm:CancelCommand

  • 다음 권한을 Amazon ECS 작업 IAM 역할에 추가합니다.

    • ssm:CreateActivation

    • ssm:AddTagsToResource

    • iam:PassRole

    참고로 관리형 인스턴스 역할의 ARN을 iam:PassRole의 리소스로 지정할 수 있습니다.

  • Amazon ECS 작업 실행 IAM 역할을 생성하고 AmazonECSTaskExecutionRolePolicy 관리형 정책을 추가합니다.

  • 태스크 정의에서 환경 변수 MANAGED_INSTANCE_ROLE_NAME관리형 인스턴스 역할 이름으로 설정합니다. 이 역할은 SSM에서 관리형 인스턴스로 등록된 태스크에 연결됩니다.

  • 관리형 인스턴스 역할에 다음 권한을 추가합니다.

    • ssm:DeleteActivation

    • ssm:DeregisterManagedInstance

  • 관리형 인스턴스 역할에 AmazonSSMManagedInstanceCore 관리형 정책을 추가합니다.

  • SSM 에이전트 컨테이너를 ECS 작업 정의에 추가합니다. 명령 스크립트는 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; yum upgrade -y; yum 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": [] }

    더 읽기 쉬운 스크립트 버전은 스크립트의 참조 버전을 참조하세요.

  • aws:ecs:task-network-blackhole-port, aws:ecs:task-network-latencyaws:ecs:task-network-packet-loss 작업을 사용하는 경우 다음 옵션 중 하나를 사용하여 ECS 작업 정의의 SSM 에이전트 컨테이너를 업데이트해야 합니다.

    • 옵션 1 - 특정 Linux 기능을 추가합니다.

      "linuxParameters": { "capabilities": { "add": [ "NET_ADMIN" ] } },
    • 옵션 2 - 모든 Linux 기능을 추가합니다.

      "privileged": true,
  • aws:ecs:task-kill-process, aws:ecs:task-network-blackhole-port, aws:ecs:task-network-latencyaws:ecs:task-network-packet-loss 작업을 사용하는 경우 ECS 작업 정의에서 pidModetask로 설정되어 있어야 합니다.

스크립트의 참조 버전

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

#!/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 yum upgrade -y yum 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

실험 템플릿 예시

다음은 aws:ecs: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": {} }