

# ECS Exec를 사용하여 Amazon ECS 컨테이너 모니터링
<a name="ecs-exec"></a>

Amazon ECS Exec을 사용하면 먼저 호스트 컨테이너 운영 체제와 상호 작용하거나 인바운드 포트를 열거나 SSH 키를 관리할 필요 없이 컨테이너와 직접 상호 작용할 수 있습니다. ECS Exec을 사용하여 명령을 실행하거나 Amazon EC2 인스턴스 또는 AWS Fargate에서 실행하는 컨테이너에 셸을 가져올 수 있습니다. 이를 통해 진단 정보를 쉽게 수집하고 오류를 신속하게 해결할 수 있습니다. 예를 들어 개발 컨텍스트에서 ECS Exec을 사용하여 컨테이너의 다양한 프로세스와 쉽게 상호 작용하고 애플리케이션 문제를 해결할 수 있습니다. 또한 프로덕션 시나리오에서 이를 사용하여 컨테이너에 중단 없이 액세스하고 문제를 디버깅할 수 있습니다.

Amazon ECS API, AWS Command Line Interface(AWS CLI), AWS SDK 또는 AWS Copilot CLI에서 ECS Exec을 사용하여 실행 중인 Linux 또는 Windows 컨테이너에서 명령을 실행할 수 있습니다. ECS Exec 사용 및 AWS Copilot CLI를 사용하는 비디오 연습에 대한 자세한 내용은 [Copilot GitHub 설명서](https://aws.github.io/copilot-cli/docs/commands/svc-exec/)를 참조하세요.

ECS Exec을 사용하여 더 엄격한 액세스 제어 정책을 유지할 수도 있습니다. 이 기능을 선택적으로 설정하여 명령을 실행할 수 있는 사용자와 해당 명령을 실행할 수 있는 태스크를 제어할 수 있습니다. 각 명령의 로그와 그 출력을 통해 ECS Exec을 사용하여 실행된 태스크를 보고 CloudTrail을 사용하여 컨테이너에 액세스한 사용자를 감사할 수 있습니다.

## 고려 사항
<a name="ecs-exec-considerations"></a>

ECS Exec을 사용할 때는 다음을 고려합니다.
+ Systems Manager에서 지원하지 않는 운영 체제에서 실행하는 경우 ECS Exec이 예상대로 작동하지 않을 수 있습니다. 지원되는 운영 체제에 대한 자세한 내용은 *AWS Systems Manager 사용 설명서*의 [운영 체제 유형](https://docs.aws.amazon.com/systems-manager/latest/userguide/operating-systems-and-machine-types.html#prereqs-os-linux)을 참조하세요.
+ ECS Exec은 다음 인프라에서 실행되는 작업에 지원됩니다.
  + Bottlerocket을 포함한 Amazon ECS 최적화 AMI에 있는 Amazon EC2의 Linux 컨테이너
  + 외부 인스턴스(Amazon ECS Anywhere)의 Linux 및 Windows 컨테이너
  + AWS Fargate의 Linux 및 Windows 컨테이너
  + 다음 Windows Amazon ECS 최적화 AMI(컨테이너 에이전트 버전 `1.56` 이상)에 있는 Amazon EC2의 Windows 컨테이너:
    + Amazon ECS 최적화 Windows Server 2022 Full AMI
    + Amazon ECS 최적화 Windows Server 2022 Core AMI
    + Amazon ECS 최적화 Windows Server 2019 Full AMI
    + Amazon ECS 최적화 Windows Server 2019 Core AMI
    + Amazon ECS 최적화 Windows Server 20H2 Core AMI
+ 태스크에 HTTP 프록시를 구성한 경우 EC2 인스턴스 메타데이터 및 IAM 역할 트래픽에 대한 프록시를 우회하도록 `NO_PROXY` 환경 변수를 `"NO_PROXY=169.254.169.254,169.254.170.2"`로 설정합니다. `NO_PROXY` 환경 변수를 구성하지 않으면 컨테이너 내의 메타데이터 엔드포인트에서 인스턴스 메타데이터 또는 IAM 역할 자격 증명을 검색할 때 오류가 발생할 수 있습니다. `NO_PROXY` 환경 변수를 권장 사항으로 설정하면 `169.254.169.254 and 169.254.170.2`에 대한 요청이 `HTTP` 프록시를 통과하지 않도록 메타데이터 및 IAM 트래픽이 필터링됩니다.
+ ECS Exec 및 Amazon VPC
  + Amazon ECS와 인터페이스 Amazon VPC 엔드포인트를 사용하는 경우 Systems Manager Session Manager(`ssmmessages`)용 인터페이스 Amazon VPC 엔드포인트를 생성해야 합니다. Systems Manager VPC 엔드포인트에 대한 자세한 정보는 *AWS Systems Manager 사용 설명서*의 [AWS PrivateLink를 사용하여 Session Manager에 대한 VPC 엔드포인트 설정](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-privatelink.html)을 참조하세요.
  + Amazon ECS와 함께 인터페이스 Amazon VPC 엔드포인트를 사용하고 있으며 암호화에 AWS KMS key를 사용하는 경우, AWS KMS key에 대한 인터페이스 Amazon VPC 엔드포인트를 생성해야 합니다. 자세한 내용은 *AWS Key Management Service 개발자 안내서*에서 [VPC 엔드포인트 구성을 통해 AWS KMS key에 연결](https://docs.aws.amazon.com/kms/latest/developerguide/kms-vpc-endpoint.html)을 참조하세요.
  + Amazon EC2 인스턴스에서 실행되는 작업이 있는 경우 `awsvpc` 네트워킹 모드를 사용합니다. 인터넷에 액세스할 수 없는 경우(예: NAT 게이트웨이를 사용하도록 구성되지 않음) Systems Manager Session Manager(`ssmmessages`)에 대한 인터페이스 Amazon VPC 엔드포인트를 생성해야 합니다. `awsvpc` 네트워크 모드 고려 사항에 대한 자세한 내용은 [Considerations](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking-awsvpc.html#linux)를 참조하세요. Systems Manager VPC 엔드포인트에 대한 자세한 정보는 **AWS Systems Manager 사용 설명서의 [AWS PrivateLink를 사용하여 Session Manager에 대한 VPC 엔드포인트 설정](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-privatelink.html)을 참조하세요.
+ Amazon ECS Exec는 IPv6 전용 구성에서 실행되는 태스크에 대해 지원되지 않습니다. IPv6 전용 구성에서 태스크를 실행하는 방법에 대한 자세한 내용은 [Fargate에 대한 Amazon ECS 태스크 네트워킹 옵션](fargate-task-networking.md) 및 [EC2에 대한 Amazon ECS 태스크 네트워킹 옵션](task-networking.md) 섹션을 참조하세요.
+ ECS Exec 및 SSM
  + 사용자가 ECS Exec을 사용하여 컨테이너에서 명령을 실행하면 이러한 명령은 `root` 사용자로 실행됩니다. SSM 에이전트와 하위 프로세스는 컨테이너에 대한 사용자 ID를 지정하는 경우에도 루트로 실행됩니다.
  + SSM 에이전트는 필요한 디렉터리 및 파일을 생성하기 위해 컨테이너 파일 시스템을 기록할 수 있어야 합니다. 따라서 `readonlyRootFilesystem` 태스크 정의 파라미터 또는 다른 메서드를 사용해 루트 파일 시스템을 읽기 전용으로 만드는 것은 지원되지 않습니다.
  + `execute-command` 작업 외부에서 SSM 세션을 시작하는 것은 가능하지만, 세션이 로깅되지 않고 세션 제한에 대해 계산됩니다. IAM 정책을 사용하여 `ssm:start-session` 태스크를 거부함으로써 이 액세스를 제한하는 것이 좋습니다. 자세한 내용은 [세션 시작 작업에 대한 액세스 제한](#ecs-exec-limit-access-start-session) 섹션을 참조하세요.
+ 다음 기능은 사이드카 컨테이너로 실행됩니다. 따라서 명령을 실행할 컨테이너 이름을 지정해야 합니다.
  + 런타임 모니터링
  + Service Connect
+ 사용자는 컨테이너 컨텍스트 내에서 사용할 수 있는 모든 명령을 실행할 수 있습니다. 컨테이너의 주 프로세스 종료, 명령 에이전트 종료 및 종속성 삭제와 같은 태스크를 수행하면 분리된 좀비 프로세스가 발생할 수 있습니다. 좀비 프로세스를 정리하려면 `initProcessEnabled` 플래그를 태스크 정의에 추가하는 것이 좋습니다.
+ ECS Exec는 약간의 CPU와 메모리를 사용합니다. 태스크 정의에서 CPU 및 메모리 리소스 할당을 지정할 때 이를 수용하고 싶을 것입니다.
+ AWS CLI 버전 `1.22.3` 이상 또는 AWS CLI 버전 `2.3.6` 이상을 사용해야 합니다. AWS CLI 업데이트 방법에 대한 자세한 정보는 *AWS Command Line Interface 버전 2 사용 설명서*의 [최신 버전의 AWS CLI 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참조하세요.
+  프로세스 ID(PID) 네임스페이스당 ECS Exec 세션을 하나만 사용할 수 있습니다. [작업에서 PID 네임스페이스를 공유](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#other_task_definition_params)하는 경우 ECS Exec 세션을 하나의 컨테이너에서만 시작할 수 있습니다.
+ ECS Exec 세션의 유휴 제한 시간은 20분입니다. 이 값은 변경할 수 없습니다.
+ 기존 작업에 대해 ECS Exec을 켤 수 없습니다. 새 작업에 대해서만 켤 수 있습니다.
+ `run-task`를 사용하여 비동기식 배치로 관리형 규모 조정을 사용하는 클러스터에서 작업을 시작하는 경우(인스턴스 없이 작업 시작) ECS Exec를 사용할 수 없습니다.
+ Microsoft Nano Server 컨테이너에서 ECS Exec를 실행할 수 없습니다.

## 아키텍처
<a name="ecs-exec-architecture"></a>

ECS Exec은 AWS Systems Manager(SSM) Session Manager를 사용하여 실행 중인 컨테이너와의 연결을 설정하고 AWS Identity and Access Management(IAM) 정책을 사용하여 실행 중인 컨테이너에서 실행 중인 명령에 대한 액세스를 제어할 수 있습니다. 이는 필요한 SSM 에이전트 바이너리를 컨테이너에 바인드 탑재하여 수행할 수 있습니다. Amazon ECS 또는 AWS Fargate 에이전트는 애플리케이션 코드와 함께 컨테이너 내부의 SSM 핵심 에이전트를 시작합니다. 자세한 내용은 [Systems Manager Session Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html)를 참조하세요.

AWS CloudTrail의 `ExecuteCommand` 이벤트를 사용하여 컨테이너에 액세스한 사용자를 감사할 수 있으며 각 명령(및 출력)을 Amazon S3 또는 Amazon CloudWatch Logs에 로깅할 수 있습니다. 사용자 고유의 암호화 키를 사용하여 로컬 클라이언트와 컨테이너 간의 데이터를 암호화하려면 AWS Key Management Service(AWS KMS) 키를 제공해야 합니다.



## ECS Exec 구성
<a name="ecs-exec-enabling-and-using"></a>

ECS Exec을 사용하려면 먼저 태스크 및 서비스에 대한 기능을 켠 다음 컨테이너에서 명령을 실행할 수 있습니다.

### 선택적 태스크 정의 변경 사항
<a name="ecs-exec-task-definition"></a>

작업 정의 파라미터 `initProcessEnabled`를 `true`로 설정하면 컨테이너 내부에서 init 프로세스가 시작됩니다. 그러면 발견된 좀비 SSM 에이전트 하위 프로세스가 제거됩니다. 다음은 예제를 제공합니다.

```
{
    "taskRoleArn": "ecsTaskRole",
    "networkMode": "awsvpc",
    "requiresCompatibilities": [
        "EC2",
        "FARGATE"
    ],
    "executionRoleArn": "ecsTaskExecutionRole",
    "memory": ".5 gb",
    "cpu": ".25 vcpu",
    "containerDefinitions": [
        {
            "name": "amazon-linux",
            "image": "amazonlinux:latest",
            "essential": true,
            "command": ["sleep","3600"],
            "linuxParameters": {
                "initProcessEnabled": true
            }
        }
    ],
    "family": "ecs-exec-task"
}
```

### 작업 및 서비스에 대해 ECS Exec 켜기
<a name="ecs-exec-enabling"></a>

AWS CLI 명령 [https://docs.aws.amazon.com/cli/latest/reference/ecs/create-service.html](https://docs.aws.amazon.com/cli/latest/reference/ecs/create-service.html), [https://docs.aws.amazon.com/cli/latest/reference/ecs/update-service.html](https://docs.aws.amazon.com/cli/latest/reference/ecs/update-service.html), [https://docs.aws.amazon.com/cli/latest/reference/ecs/start-task.html](https://docs.aws.amazon.com/cli/latest/reference/ecs/start-task.html) 또는 [https://docs.aws.amazon.com/cli/latest/reference/ecs/run-task.html](https://docs.aws.amazon.com/cli/latest/reference/ecs/run-task.html) 중 하나를 사용할 때 `--enable-execute-command` 플래그를 지정하여 서비스 및 독립 실행형 작업에 대해 ECS Exec 기능을 켤 수 있습니다.

예를 들어 다음 명령을 실행하면 Fargate에서 실행되는 새로 생성된 서비스에 대해 ECS Exec 기능이 켜집니다. 서비스 생성에 대한 자세한 내용은 [create-service](https://docs.aws.amazon.com/cli/latest/reference/ecs/create-service.html) 섹션을 참조하세요.

```
aws ecs create-service \
    --cluster cluster-name \
    --task-definition task-definition-name \
    --enable-execute-command \
    --service-name service-name \
    --launch-type FARGATE \
     --network-configuration "awsvpcConfiguration={subnets=[subnet-12344321],securityGroups=[sg-12344321],assignPublicIp=ENABLED}" \
    --desired-count 1
```

작업에 대해 ECS Exec을 켠 후 다음 명령을 실행하여 작업을 사용할 준비가 되었는지 확인할 수 있습니다. `ExecuteCommandAgent`의 `lastStatus` 속성이 `RUNNING`으로 나열되고 `enableExecuteCommand` 속성이 `true`로 설정되면 작업이 준비가 된 것입니다.

```
aws ecs describe-tasks \
    --cluster cluster-name \
    --tasks task-id
```

볼 수 있는 출력 조각의 예는 다음과 같습니다.

```
{
    "tasks": [
        {
            ...
            "containers": [
                {
                    ...
                    "managedAgents": [
                        {
                            "lastStartedAt": "2021-03-01T14:49:44.574000-06:00",
                            "name": "ExecuteCommandAgent",
                            "lastStatus": "RUNNING"
                        }
                    ]
                }
            ],
            ...
            "enableExecuteCommand": true,
            ...
        }
    ]
}
```

### ECS Exec을 사용하여 명령 실행
<a name="ecs-exec-running-commands"></a>

## ECS Exec을 사용한 로깅
<a name="ecs-exec-logging"></a>

감사 및 문제 해결을 위해 명령과 출력을 캡처하도록 ECS Exec 세션에 대한 로깅을 구성할 수 있습니다.

### 태스크 및 서비스 로그인 켜기
<a name="ecs-exec-enabling-logging"></a>

**중요**  
CloudWatch 요금에 대한 자세한 정보는 [CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing/)을 참조하세요. 또한 Amazon ECS는 추가 비용 없이 모니터링 지표도 제공합니다. 자세한 내용은 [CloudWatch를 사용하여 Amazon ECS 모니터링](cloudwatch-metrics.md) 섹션을 참조하세요.

Amazon ECS는 ECS Exec을 사용하여 실행되는 로깅 명령에 대한 기본 구성을 제공합니다. 기본값은 작업 정의에 구성된 `awslogs` 로그 드라이버를 사용하여 CloudWatch Logs로 로그를 전송하는 것입니다. 사용자 지정 구성을 제공하려는 경우 AWS CLI는 `create-cluster` 및 `update-cluster` 명령 모두에 대해 `--configuration` 플래그를 지원합니다. 컨테이너 이미지는 `script` 및 `cat`을 설치하여 명령 로그가 Amazon S3 또는 CloudWatch Logs에 올바르게 업로드되게 해야 합니다. 클러스터 생성에 대한 자세한 내용은 [create-cluster](https://docs.aws.amazon.com/cli/latest/reference/ecs/create-cluster.html)를 참조하세요.

**참고**  
이 구성은 `execute-command` 세션의 로깅만을 처리합니다. 애플리케이션의 로깅에는 영향을 미치지 않습니다.

다음 예제에서는 클러스터를 생성한 다음 출력을 `cloudwatch-log-group-name`이라는 CloudWatch Logs LogGroup과 `s3-bucket-name`이라는 Amazon S3 버킷에 로깅합니다.

`CloudWatchEncryptionEnabled` 옵션을 `true`로 설정할 때 AWS KMS 고객 관리형 키를 사용하여 로그 그룹을 암호화해야 합니다. 로그 그룹을 암호화하는 방법에 대한 자세한 내용은*Amazon CloudWatch Logs 사용 설명서*의 [AWS Key Management Service를 사용하여 CloudWatch Logs의 로그 데이터 암호화](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html#encrypt-log-data-kms-policy)를 참조하세요.

```
aws ecs create-cluster \
    --cluster-name cluster-name \
    --configuration executeCommandConfiguration="{ \
        kmsKeyId=string, \
        logging=OVERRIDE, \
        logConfiguration={ \
            cloudWatchLogGroupName=cloudwatch-log-group-name, \
            cloudWatchEncryptionEnabled=true, \
            s3BucketName=s3-bucket-name, \
            s3EncryptionEnabled=true, \
            s3KeyPrefix=demo \
        } \
    }"
```

`logging` 속성은 ECS Exec의 로깅 기능 동작을 결정합니다.
+ `NONE`: 로깅이 꺼져 있습니다.
+ `DEFAULT`: 구성된 `awslogs` 드라이버로 로그가 전송됩니다. 드라이버가 구성되지 않은 경우 로그는 저장되지 않습니다.
+ `OVERRIDE`: 제공된 Amazon CloudWatch Logs LogGroup, Amazon S3 버킷 또는 두 위치 모두에 로그가 전송됩니다.

### Amazon CloudWatch Logs 또는 Amazon S3 로깅에 필요한 IAM 권한
<a name="ecs-exec-required-logging-permissions"></a>

로깅을 활성화하려면 태스크 정의에서 참조되는 Amazon ECS 작업 역할에 추가 권한이 있어야 합니다. 이러한 추가 권한은 작업 역할에 정책으로 추가할 수 있습니다. Amazon CloudWatch Logs 또는 Amazon S3에 로그를 전달하는지 여부에 따라 다릅니다.

------
#### [ Amazon CloudWatch Logs ]

다음 예제 정책은 필수 Amazon CloudWatch Logs 권한을 추가합니다.

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:DescribeLogGroups"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
               "logs:CreateLogStream",
               "logs:DescribeLogStreams",
               "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:us-east-1:111122223333:log-group:/aws/ecs/cloudwatch-log-group-name:*"
        }
   ]
}
```

------
#### [ Amazon S3 ]

다음 예제 정책은 필수 Amazon S3 권한을 추가합니다.

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
        {
            "Effect": "Allow",
            "Action": [
               "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },
        {
           "Effect": "Allow",
           "Action": [
               "s3:GetEncryptionConfiguration"
           ],
           "Resource": "arn:aws:s3:::s3-bucket-name"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::s3-bucket-name/*"
        }
    ]
   }
```

------

### 자체 AWS KMS key(KMS 키)를 사용한 암호화에 필요한 IAM 권한
<a name="ecs-exec-required-kms-permissions"></a>

기본적으로 로컬 클라이언트와 컨테이너 간에 전송되는 데이터는 AWS에서 제공하는 TLS 1.2 암호화를 사용합니다. 자체 KMS 키를 사용하여 데이터를 추가로 암호화하려면 KMS 키를 생성하고 `kms:Decrypt` 권한을 작업 IAM 역할에 추가해야 합니다. 이 권한은 데이터를 복호화하기 위해 컨테이너에서 사용됩니다. KMS 키 생성에 대한 자세한 내용은 [키 생성](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)을 참조하세요.

AWS KMS 권한이 필요한 작업 IAM 역할에 다음과 같은 인라인 정책을 추가합니다. 자세한 내용은 [ECS Exec 권한](task-iam-roles.md#ecs-exec-required-iam-permissions) 섹션을 참조하세요.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
    ]
}
```

------

자체 KMS 키를 사용하여 데이터를 암호화하려면 `execute-command` 태스크를 사용하는 사용자 또는 그룹에 `kms:GenerateDataKey` 권한을 부여해야 합니다.

사용자 또는 그룹에 대한 다음 예제 정책에는 자체 KMS 키를 사용하는 데 필요한 권한이 포함되어 있습니다. KMS 키의 Amazon 리소스 이름(ARN)을 지정해야 합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
    ]
}
```

------

## IAM 정책을 사용하여 ECS Exec에 대한 액세스 제한
<a name="ecs-exec-best-practices-limit-access-execute-command"></a>

다음 IAM 정책 조건 키 중 하나 이상을 사용하여 execute-command API 작업에 대한 사용자 액세스를 제한합니다.
+ `aws:ResourceTag/clusterTagKey`
+ `ecs:ResourceTag/clusterTagKey`
+ `aws:ResourceTag/taskTagKey`
+ `ecs:ResourceTag/taskTagKey`
+ `ecs:container-name`
+ `ecs:cluster`
+ `ecs:task`
+ `ecs:enable-execute-command`

사용자는 다음 예제 IAM 정책을 사용하여 `environment` 키와 `development` 값이 있는 태그가 포함된 작업 내에서 실행 중인 컨테이너와 `cluster-name`이라는 클러스터에서 명령을 실행할 수 있습니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:ExecuteCommand",
                "ecs:DescribeTasks"
            ],
            "Resource": [
                   "arn:aws:ecs:us-east-1:111122223333:task/cluster-name/*",
                   "arn:aws:ecs:us-east-1:111122223333:cluster/cluster-name"
            ],
            "Condition": {
                "StringEquals": {
                    "ecs:ResourceTag/environment": "development"
                }
            }
        }
    ]
}
```

------

다음 IAM 정책 예제에서 사용자는 컨테이너 이름이 `production-app`일 때 `execute-command` API를 사용할 수 없습니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "ecs:ExecuteCommand"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {                    
                    "ecs:container-name": "production-app"
                }
            }
        }
    ]
}
```

------

다음 IAM 정책을 사용하면 ECS Exec이 꺼진 경우에만 작업을 시작할 수 있습니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:RunTask",
                "ecs:StartTask",
                "ecs:CreateService",
                "ecs:UpdateService"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {                    
                    "ecs:enable-execute-command": "false"
                }
            }
        }
    ]
}
```

------

**참고**  
왜냐하면 `execute-command` API 작업에는 요청의 작업 및 클러스터 리소스만 포함되며 클러스터 및 태스크 태그만 평가되기 때문입니다.

IAM 정책 조건 키에 대한 자세한 내용은 *서비스 승인 참조*의 [Amazon Elastic Container Service에 사용되는 작업, 리소스 및 조건 키](/service-authorization/latest/reference/list_amazonelasticcontainerservice.html)를 참조하세요.

### 세션 시작 작업에 대한 액세스 제한
<a name="ecs-exec-limit-access-start-session"></a>

ECS Exec 외부의 컨테이너에서 SSM 세션을 시작할 수 있지만 이로 인해 세션이 로깅되지 않을 수 있습니다. ECS Exec 외부에서 시작된 세션도 세션 할당량에 대해 계산됩니다. IAM 정책을 사용하여 Amazon ECS 작업에 대한 `ssm:start-session` 태스크를 직접 거부함으로써 이 액세스를 제한하는 것이 좋습니다. 모든 Amazon ECS 작업 또는 사용된 태그를 기반으로 특정 작업에 대한 액세스를 거부할 수 있습니다.

다음은 클러스터 이름이 지정된 모든 리전의 작업에서 `ssm:start-session` 작업에 대한 액세스를 거부하는 IAM 정책 예제입니다. 선택적으로 `cluster-name`이 있는 와일드카드를 포함할 수 있습니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "ssm:StartSession",
            "Resource": [
                   "arn:aws:ecs:us-east-1:111122223333:task/cluster-name/*"
            ]
        }
    ]
}
```

------

다음은 태그 키 `Task-Tag-Key`, 태그 값 `Exec-Task`로 태그가 지정된 모든 리전의 리소스에서 `ssm:start-session` 작업에 대한 액세스를 거부하는 IAM 정책 예제입니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "ssm:StartSession",
            "Resource": "arn:aws:ecs:*:*:task/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Task-Tag-Key": "Exec-Task"
                }
            }
        }
    ]
}
```

------

## ECS Exec 문제 해결
<a name="ecs-exec-troubleshooting-overview"></a>

추가적인 문제 해결 정보는 [ECS Exec 문제 해결](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec-troubleshooting.html)을 참조하세요.

# ECS Exec을 사용하여 명령 실행
<a name="ecs-exec-run"></a>

Amazon ECS Exec을 사용하여 컨테이너와 관련된 진단 정보를 수집하고 컨테이너의 수명 주기 동안 발생하는 오류를 해결할 수 있습니다.

## 사전 조건
<a name="ecs-exec-run-prerequisites"></a>

ECS Exec를 사용하기 전에 다음 작업을 완료했는지 확인합니다.
+ 고려 사항을 검토하세요. 자세한 내용은 [고려 사항](ecs-exec.md#ecs-exec-considerations) 섹션을 참조하세요.
+ 태스크 및 서비스에 대해 ECS Exec을 구성합니다. 자세한 내용은 [ECS Exec 구성](ecs-exec.md#ecs-exec-enabling-and-using) 섹션을 참조하세요.
+ **AWS CLI를 설치하고 구성합니다**. 자세한 내용은 [AWS CLI 시작하기](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)를 참조하세요.
+ **AWS CLI에 대한 Session Manager 플러그인을 설치합니다**. 자세한 내용은 [AWS CLI에 대한 Session Manager 플러그인 설치](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html)를 참조하세요.
+ **적합한 권한으로 태스크 역할을 구성합니다**. ECS Exec에 대한 적절한 권한이 있는 태스크 역할을 사용해야 합니다. 자세한 내용은 [Task IAM role](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)을 참조하세요.
+ **버전 요구 사항을 확인합니다**. ECS Exec은 작업이 Amazon EC2 또는 AWS Fargate에 호스팅되는지 여부에 따라 버전 요구 사항이 있습니다.
  + Amazon EC2를 사용하는 경우 2021년 1월 20일 이후에 출시된 Amazon ECS 최적화 AMI를 에이전트 버전 1.50.2 이상으로 사용해야 합니다. 자세한 내용은 [Amazon ECS 최적화 AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html)를 참조하세요.
  + AWS Fargate을(를) 사용하는 경우 플랫폼 버전 `1.4.0` 이상(Linux) 또는 `1.0.0`(Windows)을(를) 사용해야 합니다. 자세한 내용은 [AWS Fargate 플랫폼 버전](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform-fargate.html)을 참조하세요.

## 서비스 태스크에 콘솔 사용
<a name="ecs-exec-run-using-console"></a>

콘솔을 사용하여 ECS Exec을 통해 명령을 실행할 수 있습니다.

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

1. **클러스터(Clusters)** 페이지에서 클러스터를 선택합니다.

1. 클러스터 세부 정보 페이지의 **서비스** 섹션에서 서비스를 선택합니다.

   서비스 세부 정보 페이지가 표시됩니다.

1. 서비스 세부 정보 페이지에서 **태스크**를 선택합니다. 그런 다음 태스크를 선택합니다.

1. **컨테이너**에서 ECS Exec을 사용할 컨테이너를 선택합니다.

1. 명령을 실행하려면 다음 중 하나를 수행합니다.
   + **연결**을 선택합니다.

     명령을 실행할 수 있는 CloudShell 세션이 표시됩니다.
   + 화살표를 선택한 다음 **AWS CLI 명령 복사**를 선택합니다.

     그러면 명령을 로컬로 실행할 수 있습니다.

**예상 결과**

연결되면 컨테이너에서 대화형 셸 프롬프트가 표시됩니다. 이제 컨테이너 환경에서 직접 명령을 실행할 수 있습니다. 세션을 종료하려면 **세션 종료**를 선택합니다.

## 독립 실행형 태스크에 콘솔 사용
<a name="ecs-exec-run-using-console-standalone-tasks"></a>

콘솔을 사용하여 ECS Exec을 통해 명령을 실행할 수 있습니다.

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

1. **클러스터(Clusters)** 페이지에서 클러스터를 선택합니다.

1. 클러스터 세부 정보 페이지의 **태스크** 섹션에서 작업을 선택합니다.

   태스크 세부 정보 페이지가 표시됩니다.

1. **컨테이너**에서 ECS Exec을 사용할 컨테이너를 선택합니다.

1. 명령을 실행하려면 다음 중 하나를 수행합니다.
   + **연결**을 선택합니다.

     명령을 실행할 수 있는 CloudShell 세션이 표시됩니다.
   + 화살표를 선택한 다음 **AWS CLI 명령 복사**를 선택합니다.

     그러면 명령을 로컬로 실행할 수 있습니다.

**예상 결과**

연결되면 컨테이너에서 대화형 셸 프롬프트가 표시됩니다. 이제 컨테이너 환경에서 직접 명령을 실행할 수 있습니다. 세션을 종료하려면 **세션 종료**를 선택합니다.

## 명령 셸 사용
<a name="ecs-exec-run-using-command-shell"></a>

명령 셸을 사용하여 ECS Exec을 통해 명령을 실행할 수 있습니다.

`ExecuteCommandAgent`가 실행 중임을 확인한 후 다음 명령을 사용하여 컨테이너에서 대화형 셸을 열 수 있습니다. 작업에 컨테이너가 여러 개 포함되어 있는 경우 `--container` 플래그를 사용하여 컨테이너 이름을 지정해야 합니다. Amazon ECS는 대화형 세션 시작만 지원하므로 `--interactive` 플래그를 사용해야 합니다.

다음 명령은 ID가 *task-id*인 작업에 대해 **container-name**이라는 컨테이너에서 대화형 `/bin/sh` 명령을 실행합니다.

*task-id*는 작업의 Amazon 리소스 이름(ARN)입니다.

```
aws ecs execute-command --cluster cluster-name \
    --task task-id \
    --container container-name \
    --interactive \
    --command "/bin/sh"
```

**예상 결과**

명령이 성공하면 컨테이너에서 대화형 셸 프롬프트가 표시됩니다. 이제 컨테이너 환경에서 직접 명령을 실행할 수 있습니다. 세션을 종료하려면 `exit`를 입력하거나 `Ctrl+D`를 누릅니다.