

# Amazon ECS 환경 변수를 통해 Secrets Manager 보안 암호 전달
<a name="secrets-envvar-secrets-manager"></a>

암호를 환경 변수로 주입하는 경우 암호의 전체 내용, 암호 내 특정 JSON 키를 지정할 수 있습니다. 이는 컨테이너에 노출되는 민감한 데이터를 제어하는 데 도움이 됩니다. 암호 버전 관리에 대한 자세한 내용은 *AWS Secrets Manager 사용 설명서*의 [Secrets Manager에는 무엇이 있습니까?](https://docs.aws.amazon.com/secretsmanager/latest/userguide/whats-in-a-secret.html#term_version)를 참조하세요.

환경 변수를 사용하여 컨테이너에 Secrets Manager 보안 암호를 삽입할 때 다음을 고려해야 합니다.
+ 컨테이너가 처음 시작될 때 해당 컨테이너에 중요한 정보가 주입됩니다. 암호가 이후에 업데이트되거나 교체되면 컨테이너가 업데이트된 값을 자동으로 받지 않습니다. 새 태스크를 시작해야 하거나 작업이 서비스의 일부인 경우 서비스를 업데이트하고 **새 배포 강제 적용**을 사용하여 서비스에서 새 태스크를 시작하도록 강제로 지정할 수 있습니다.
+ 컨테이너에서 실행되는 애플리케이션, 컨테이너 로그 및 디버깅 도구는 환경 변수에 액세스할 수 있습니다.
+ AWS Fargate에서의 Amazon ECS 태스크의 경우 다음 사항을 고려합니다.
  + 암호의 전체 내용을 환경 변수 또는 로그 구성으로 주입하려면 플랫폼 버전 `1.3.0` 이상을 사용해야 합니다. 자세한 내용은 [Amazon ECS에 대한 Fargate 플랫폼 버전](platform-fargate.md) 섹션을 참조하세요.
  + 암호의 JSON 키 또는 버전을 환경 변수 또는 로그 구성으로 주입하려면 플랫폼 버전 `1.4.0` 이상(Linux) 또는 `1.0.0`(Windows)을 사용해야 합니다. 자세한 내용은 [Amazon ECS에 대한 Fargate 플랫폼 버전](platform-fargate.md) 섹션을 참조하세요.
+ EC2에서의 Amazon ECS 태스크의 경우 다음 사항을 고려해야 합니다.
  + 암호의 특정 JSON 키 또는 버전을 사용하여 암호를 주입하려면 컨테이너 인스턴스에 컨테이너 에이전트 버전 `1.37.0` 이상이 있어야 합니다. 그러나 최신 버전의 컨테이너 에이전트를 사용하는 것이 좋습니다. 에이전트 버전을 확인하고 최신 버전으로 업데이트하는 방법에 대한 자세한 내용은 [Amazon ECS 컨테이너 에이전트 업데이트](ecs-agent-update.md) 섹션을 참조하세요.

    암호의 전체 내용을 환경 변수로 주입하거나 로그 구성에 암호를 주입하려면 컨테이너 인스턴스에 컨테이너 에이전트 버전 `1.22.0` 이상이 있어야 합니다.
+ 인터페이스 VPC 엔드포인트를 사용하여 보안 제어를 향상하고 프라이빗 서브넷을 통해 Secrets Manager에 연결합니다. Secrets Manager용 인터페이스 VPC 엔드포인트를 생성해야 합니다. VPC 엔드포인트에 대한 자세한 내용은 *AWS Secrets Manager 사용 설명서*의 [VPC 종단점 생성](https://docs.aws.amazon.com/secretsmanager/latest/userguide/setup-create-vpc.html)을 참조하세요. Secrets Manager 및 Amazon VPC 사용에 대한 자세한 내용은 [How to connect to Secrets Manager service within a Amazon VPC](https://aws.amazon.com/blogs//security/how-to-connect-to-aws-secrets-manager-service-within-a-virtual-private-cloud/)를 참조하세요.
+ `awslogs` 로깅 드라이버를 사용하도록 구성된 Windows 태스크의 경우 컨테이너 인스턴스에 `ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE` 환경 변수도 설정해야 합니다. 다음 구문을 사용합니다.

  ```
  <powershell>
  [Environment]::SetEnvironmentVariable("ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE", $TRUE, "Machine")
  Initialize-ECSAgent -Cluster <cluster name> -EnableTaskIAMRole -LoggingDrivers '["json-file","awslogs"]'
  </powershell>
  ```
+ 태스크 정의에서 Secrets Manager에 대한 추가 권한을 보유한 작업 실행 역할을 사용해야 합니다. 자세한 내용은 [Amazon ECS 태스크 실행 IAM 역할](task_execution_IAM_role.md) 섹션을 참조하세요.

## AWS Secrets Manager 보안 암호 생성
<a name="secrets-envvar-secrets-manager-create-secret"></a>

Secrets Manager 콘솔을 사용하여 민감한 데이터에 대한 암호를 생성할 수 있습니다. 자세한 정보는 *AWS Secrets Manager 사용 설명서*의 [AWS Secrets Manager 보안 암호 생성](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)을 참조하세요.

## 컨테이너 정의에 환경 변수 추가
<a name="secrets-envvar-secrets-manager-update-container-definition"></a>

컨테이너 정의 내에서 다음을 지정할 수 있습니다.
+ 컨테이너에 설정할 환경 변수의 이름을 포함하는 `secrets` 객체
+ Secrets Manager 암호의 Amazon 리소스 이름(ARN)
+ 컨테이너에 제공할 중요한 데이터를 포함하는 추가 파라미터

다음 예제에서는 Secrets Manager 암호에 대해 지정해야 하는 전체 구문을 보여 줍니다.

```
arn:aws:secretsmanager:{{region}}:{{aws_account_id}}:secret:{{secret-name}}:{{json-key}}:{{version-stage}}:{{version-id}}
```

다음 섹션에서는 추가 파라미터에 대해 설명합니다. 이러한 파라미터는 선택 사항이지만 사용하지 않는 경우 기본값을 사용하려면 콜론(`:`)을 포함시켜야 합니다. 추가 컨텍스트에 대한 예제가 아래에 나와 있습니다.

`json-key`  
환경 변수 값으로 설정할 값과 함께 키-값 쌍의 키 이름을 지정합니다. JSON 형식의 값만 지원됩니다. JSON 키를 지정하지 않으면 암호의 전체 내용이 사용됩니다.

`version-stage`  
사용할 암호 버전의 스테이징 레이블을 지정합니다. 버전 스테이징 레이블이 지정된 경우 버전 ID를 지정할 수 없습니다. 버전 단계가 지정되지 않은 경우 기본 동작은 `AWSCURRENT` 스테이징 레이블을 사용하여 암호를 검색하는 것입니다.  
스테이징 레이블은 암호가 업데이트되거나 교체되는 경우 암호의 여러 버전을 추적하는 데 사용됩니다. 암호의 각 버전에는 하나 이상의 스테이징 레이블과 ID가 있습니다.

`version-id`  
사용하고자 하는 암호 버전의 고유 식별자를 지정합니다. 버전 ID가 지정된 경우 버전 스테이징 레이블을 지정할 수 없습니다. 버전 ID가 지정되지 않은 경우 기본 동작은 `AWSCURRENT` 스테이징 레이블을 사용하여 암호를 검색하는 것입니다.  
버전 ID는 암호가 업데이트되거나 교체되는 경우 암호의 여러 버전을 추적하는 데 사용됩니다. 암호의 각 버전에는 ID가 있습니다. 자세한 정보는 *AWS Secrets Manager 사용 설명서*의 [AWS Secrets Manager의 주요 개념 및 용어](https://docs.aws.amazon.com/secretsmanager/latest/userguide/terms-concepts.html#term_secret)를 참조하세요.

### 컨테이너 정의 예제
<a name="secrets-examples"></a>

다음 예제에서는 컨테이너 정의에서 Secretes Manager 암호를 참조할 수 있는 방법을 보여 줍니다.

**Example 전체 암호 참조**  
다음은 Secret Manager 암호의 전체 텍스트를 참조할 때 형식을 나타내는 태스크 정의의 조각입니다.  

```
{
  "containerDefinitions": [{
    "secrets": [{
      "name": "{{environment_variable_name}}",
      "valueFrom": "arn:aws:secretsmanager:{{region}}:{{aws_account_id}}:secret:{{secret_name-AbCdEf}}"
    }]
  }]
}
```
컨테이너 내에서 이 보안 암호의 값에 액세스하려면 `$environment_variable_name` 변수를 호출해야 합니다.

**Example 전체 시크릿 참조**  
다음은 여러 Secret Manager 시크릿의 전체 텍스트를 참조할 때 형식을 나타내는 태스크 정의의 조각입니다.  

```
{
  "containerDefinitions": [{
     "secrets": [
      {
        "name": "{{environment_variable_name1}}",
         "valueFrom": "arn:aws:secretsmanager:{{region}}:{{aws_account_id}}:secret:{{secret_name-AbCdEf}}"
      },
      {
        "name": "{{environment_variable_name2}}",
         "valueFrom": "arn:aws:secretsmanager:{{region}}:{{aws_account_id}}:secret:{{secret_name-abcdef}}"
      },
      {
        "name": "{{environment_variable_name3}}",
        "valueFrom": "arn:aws:secretsmanager:{{region}}:{{aws_account_id}}:secret:{{secret_name-ABCDEF}}"
      }
    ]
  }]
}
```
컨테이너 내에서 이 시크릿의 값에 액세스하려면 `$environment_variable_name1`, `$environment_variable_name2`, `$environment_variable_name3`을 직접적으로 호출해야 합니다.

**Example 암호 내에서 특정 키 참조**  
다음은 암호의 내용을 관련 버전 스테이징 레이블 및 버전 ID와 함께 표시하는 [get-secret-value](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/get-secret-value.html) 명령의 출력 예를 보여 줍니다.  

```
{
    "ARN": "arn:aws:secretsmanager:{{region}}:{{aws_account_id}}:secret:{{appauthexample-AbCdEf}}",
    "Name": "{{appauthexample}}",
    "VersionId": "{{871d9eca-18aa-46a9-8785-981ddEXAMPLE}}",
    "SecretString": "{\"{{username1}}\":\"{{password1}}\",\"{{username2}}\":\"{{password2}}\",\"{{username3}}\":\"{{password3}}\"}",
    "VersionStages": [
        "{{AWSCURRENT}}"
    ],
    "CreatedDate": 1581968848.921
}
```
ARN 끝에 키 이름을 지정하여 컨테이너 정의에서 이전 출력의 특정 키를 참조합니다.  

```
{
  "containerDefinitions": [{
    "secrets": [{
      "name": "{{environment_variable_name}}",
      "valueFrom": "arn:aws:secretsmanager:{{region}}:{{aws_account_id}}:secret:{{appauthexample-AbCdEf}}:{{username1}}::"
    }]
  }]
}
```

**Example 특정 비밀 버전 참조**  
다음은 암호의 암호화되지 않은 내용을 모든 버전의 암호에 대한 메타데이터와 함께 표시하는 [describe-secret](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/describe-secret.html) 명령의 출력 예입니다.  

```
{
    "ARN": "arn:aws:secretsmanager:{{region}}:{{aws_account_id}}:secret:{{appauthexample-AbCdEf}}",
    "Name": "{{appauthexample}}",
    "Description": "Example of a secret containing application authorization data.",
    "RotationEnabled": false,
    "LastChangedDate": 1581968848.926,
    "LastAccessedDate": 1581897600.0,
    "Tags": [],
    "VersionIdsToStages": {
        "{{871d9eca-18aa-46a9-8785-981ddEXAMPLE}}": [
            "{{AWSCURRENT}}"
        ],
        "{{9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE}}": [
            "{{AWSPREVIOUS}}"
        ]
    }
}
```
ARN 끝에 키 이름을 지정하여 컨테이너 정의에서 이전 출력의 특정 버전 스테이징 레이블을 참조합니다.  

```
{
  "containerDefinitions": [{
    "secrets": [{
      "name": "{{environment_variable_name}}",
      "valueFrom": "arn:aws:secretsmanager:{{region}}:{{aws_account_id}}:secret:{{appauthexample-AbCdEf}}::{{AWSPREVIOUS}}:"
    }]
  }]
}
```
ARN 끝에 키 이름을 지정하여 컨테이너 정의에서 이전 출력의 특정 버전 ID를 참조합니다.  

```
{
  "containerDefinitions": [{
    "secrets": [{
      "name": "{{environment_variable_name}}",
      "valueFrom": "arn:aws:secretsmanager:{{region}}:{{aws_account_id}}:secret:{{appauthexample-AbCdEf}}:::{{9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE}}"
    }]
  }]
}
```

**Example 암호의 특정 키 및 버전 스테이징 레이블 참조**  
다음은 암호 내 특정 키와 특정 버전 스테이징 레이블을 모두 참조하는 방법을 보여줍니다.  

```
{
  "containerDefinitions": [{
    "secrets": [{
      "name": "{{environment_variable_name}}",
      "valueFrom": "arn:aws:secretsmanager:{{region}}:{{aws_account_id}}:secret:{{appauthexample-AbCdEf}}:{{username1}}:{{AWSPREVIOUS}}:"
    }]
  }]
}
```
특정 키 및 버전 ID를 지정하려면 다음 구문을 사용합니다.  

```
{
  "containerDefinitions": [{
    "secrets": [{
      "name": "{{environment_variable_name}}",
      "valueFrom": "arn:aws:secretsmanager:{{region}}:{{aws_account_id}}:secret:{{appauthexample-AbCdEf}}:{{username1}}::{{9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE}}"
    }]
  }]
}
```

환경 변수에 지정된 보안 암호를 사용하여 태스크 정의를 생성하는 방법에 대한 자세한 내용은 [콘솔을 사용하여 Amazon ECS 작업 정의 생성](create-task-definition.md) 섹션을 참조하세요.