ECS에 Consul 수동 배포

ECS에 Consul 수동 배포 (Deploy Consul to ECS manually)

다음 지침은 Terraform 없이 consul-ecs Docker 이미지를 사용하여 ECS 작업 정의를 수동으로 만드는 방법을 설명해요. 서비스 메시를 여러 Consul 데이터센터나 파티션에 피어링하려면 Consul ECS Terraform 모듈을 사용하여 ECS에 서비스 메시를 설치해야 해요. ECS 클러스터에 mesh 게이트웨이를 배포하는 수동 프로세스는 없어요.

출처: 문서

본문

다음 지침은 Terraform 없이 consul-ecs Docker 이미지를 사용하여 ECS 작업 정의를 수동으로 만드는 방법을 설명합니다. 서비스 메시를 여러 Consul 데이터센터나 파티션에 피어링하려면 Consul ECS Terraform 모듈을 사용하여 ECS에 서비스 메시를 설치해야 합니다. ECS 클러스터에 mesh 게이트웨이를 배포하는 수동 프로세스는 없습니다.

요구 사항 (Requirements)

AWS ECS에 대한 기본적인 지식이 있어야 합니다. 자세한 내용은 What is Amazon Elastic Container Service을 참조하세요.

보안 구성 요구 사항 (Secure configuration requirements)

Consul 서비스 메시에서 보안 기능을 활성화하려면 다음 요구 사항과 사전 조건을 충족해야 합니다:

  • Consul 서버에서 TLS 암호화를 활성화하여 gRPC를 통해 Consul dataplane 컨테이너와 안전하게 통신하도록 합니다.
  • Consul 서버에서 ACL(액세스 제어 목록)을 활성화합니다. ACL은 메시의 Consul 서버에 대한 액세스를 위한 인증 및 인가를 제공합니다.
  • ECS에서 민감한 데이터를 지정하는 방법에 익숙해야 합니다. 자세한 내용은 AWS 문서의 Passing sensitive data to a container를 참조하세요.

ACL 토큰과 정책을 만드는 방법을 포함하여 Consul의 보안 기능을 구성하는 방법에 익숙해야 합니다. 다음 리소스를 참조하세요:

Consul은 각 ECS 작업 패밀리에 대해 고유한 IAM 역할이 필요합니다. 작업 패밀리는 각 Consul 서비스에 고유하므로 작업 IAM 역할은 다른 작업 패밀리와 공유할 수 없습니다.

ECS 작업 정의 파일 구성 (Configure ECS task definition file)

작업 정의용 JSON 파일을 만드세요. 작업 정의는 AWS의 소프트웨어 서비스를 위한 ECS 블루프린트입니다. 자세한 내용은 AWS 문서의 ECS task definitions을 참조하세요.

애플리케이션 컨테이너 외에도 다음 Consul 컨테이너를 만드는 구성을 작업 정의에 추가하세요:

  • Dataplane 컨테이너
  • Control-plane 컨테이너
  • ECS controller 컨테이너

최상위 필드 (Top-level fields)

다음 표는 작업 정의에 포함해야 하는 최상위 필드를 설명합니다:

Field name Description Type
family 작업 패밀리 이름입니다. 기본적으로 Consul 서비스 이름으로 사용됩니다. string
networkMode awsvpc여야 합니다. ECS에서 Consul이 지원하는 유일한 네트워크 모드입니다. string
volumes 초기 작업 설정 중 컨테이너 간에 구성을 공유하기 위한 호스트의 볼륨입니다. consul_data 및 consul_binary 바인드 마운트를 정의해야 합니다. 바인드 마운트는 파일을 공유하기 위해 하나 이상의 컨테이너에 마운트할 수 있습니다. ECS에서 Consul의 경우 특정 바이너리와 구성이 작업 시작 중에 컨테이너 간에 공유됩니다. list
containerDefinitions 작업에서 실행되는 애플리케이션 컨테이너를 정의합니다. Define your application container을 참조하세요. list

다음 예제는 최상위 필드를 보여줍니다:

{
  "family": "my-example-client-app",
  "networkMode": "awsvpc",
  "volumes": [
    {
      "name": "consul_data"
    },
    {
      "name": "consul_binary"
    }
  ],
  "containerDefinitions": [...],
  "tags": [
    {
      "key": "consul.hashicorp.com/mesh",
      "value": "true"
    },
    {
      "key": "consul.hashicorp.com/service-name",
      "value":  "example-client-app"
    }
  ]
}

작업 태그 구성 (Configure task tags)

tags 목록은 보안 구성에서 ECS controller를 사용하는 경우 다음 태그를 포함해야 합니다. 이러한 태그가 없으면 ACL controller가 작업에 대한 서비스 토큰을 프로비저닝할 수 없습니다.

Tag Description Type Default
consul.hashicorp.com/mesh ECS controller를 활성화합니다. false로 설정하면 ECS controller가 비활성화됩니다. String true
consul.hashicorp.com/service-name 이 작업과 연결된 Consul 서비스의 이름을 지정합니다. 서비스 이름이 작업 family와 다른 경우 필요합니다. String None
consul.hashicorp.com/partition Enterprise 이 작업과 연결된 Consul admin 파티션을 지정합니다. String default
consul.hashicorp.com/namespace Enterprise 이 작업과 연결된 Consul namespace의 이름을 지정합니다. String default

애플리케이션 컨테이너 정의 (Define your application container)

containerDefinitions 필드에서 애플리케이션 컨테이너 구성을 지정하세요. 다음 표는 모든 containerDefinitions 필드를 설명합니다:

Field name Description Type
name 애플리케이션 컨테이너의 이름입니다. string
image 애플리케이션을 실행하는 데 사용되는 컨테이너 이미지입니다. string
essential 애플리케이션 컨테이너의 상태가 작업의 상태에 영향을 주도록 하려면 true여야 합니다. boolean
dependsOn 애플리케이션 컨테이너가 서비스 메시 설정 완료 후 시작되도록 보장하는 컨테이너 종속성을 지정합니다. 자세한 내용은 Application container dependency configuration를 참조하세요. list

전체 참조는 ECS Task Definition 문서를 참조하세요.

애플리케이션 컨테이너 종속성 구성 (Application container dependency configuration)

control-plane 및 dataplane 컨테이너는 특정 시작 순서를 강제하는 종속성입니다. 이러한 설정은 control-plane 컨테이너가 작업 설정을 마친 후와 dataplane이 이 작업과 서비스 메시 간 트래픽을 프록시할 준비가 된 후에 애플리케이션 컨테이너가 시작되도록 보장합니다.

dependsOn 목록에는 다음 맵이 포함되어야 합니다:

{
  {
    "containerName": "consul-ecs-control-plane",
    "condition": "SUCCESS"
  },
  {
    "containerName": "consul-dataplane",
    "condition": "HEALTHY"
  }
}

dataplane 컨테이너 구성 (Configure the dataplane container)

dataplane 컨테이너는 Consul 서비스 메시용 Envoy 프록시를 실행합니다. 다음 표에 설명된 필드를 지정하여 dataplane 컨테이너를 선언하세요:

Field name Description Type
name 컨테이너의 이름을 지정합니다. consul-dataplane이어야 합니다. string
image Envoy 이미지를 지정합니다. 지원되는 Envoy 버전이어야 합니다. string
dependsOn control-pane 컨테이너가 Envoy bootstrap 구성 파일을 쓴 후 dataplane 컨테이너가 시작되도록 보장하는 컨테이너 종속성을 지정합니다. 자세한 내용은 Dataplane container dependency configuration를 참조하세요. list
healthCheck 컨테이너 종속성 및 시작 순서에 연결되는 Envoy의 기본 리스너 포트 상태를 모니터링하려면 위와 같이 설정해야 합니다. map
mountPoints dataplane 컨테이너가 control-plane 컨테이너가 생성한 Envoy 구성 파일에 액세스하고 사용할 수 있도록 공유 볼륨을 지정합니다. 이 구성의 키와 값은 Dataplane container dependency configuration에 설명된 대로 정의해야 합니다. list
ulimits Envoy가 소켓을 열지 못하지 않도록 nofile ulimit를 충분히 높은 값으로 올려야 합니다. list
entrypoint 정상 종료(graceful shutdown)를 위해 사용자 지정 Envoy 엔트리포인트 consul-ecs envoy-entrypoint로 설정해야 합니다. list
command Envoy에 bootstrap 구성을 전달하는 시작 명령을 지정합니다. list

dataplane 컨테이너 종속성 구성 (Dataplane container dependency configuration)

dependsOn 구성은 control-plane 컨테이너가 Envoy bootstrap 구성 파일을 공유 볼륨에 성공적으로 쓴 후 dataplane 컨테이너가 시작되도록 보장합니다. dependsOn 목록에는 다음 맵이 포함되어야 합니다:

[
  {
    "containerName": "consul-ecs-control-plane",
    "condition": "SUCCESS"
  }
]

dataplane 컨테이너 볼륨 마운트 구성 (Dataplane container volume mount configuration)

mountPoints 구성은 dataplane 컨테이너가 control-plane 컨테이너가 생성한 Envoy bootstrap 구성 파일을 사용할 수 있는 볼륨과 경로를 정의합니다. 다음 키와 값을 지정해야 합니다:

{
  "mountPoints": [
    {
      "readOnly": true,
      "containerPath": "/consul",
      "sourceVolume": "consul_data"
    }
  ],
}

control-plane 컨테이너 구성 (Configure the control-plane container)

control-plane 컨테이너는 시작하는 첫 번째 Consul 컨테이너이며 Consul 서비스 메시용 인스턴스를 설정합니다. 이 작업의 서비스와 프록시를 Consul에 등록하고 Envoy bootstrap 구성을 공유 볼륨에 씁니다.

다음 표에 설명된 필드를 지정하여 control-plane 컨테이너를 선언하세요:

Field name Description Type
name 컨테이너의 이름을 지정합니다. control-plane이어야 합니다. string
image consul-ecs 이미지를 지정합니다. 속도 제한을 피하려면 다음 공개 AWS 레지스트리를 지정하세요: public.ecr.aws/hashicorp/consul-ecs string
mountPoints dataplane 컨테이너가 액세스하고 사용할 수 있는 Envoy bootstrap 구성 파일을 저장할 공유 볼륨을 지정합니다. 이 구성의 키와 값은 Control-plane shared volume configuration에 설명된 대로 정의해야 합니다. list
command 컨테이너가 control-plane 명령을 실행하도록 ["control-plane"]로 설정합니다. list
environment 컨테이너가 Consul 서버에 연결하도록 구성하는 CONSUL_ECS_CONFIG_JSON 환경 변수를 지정합니다. 자세한 내용은 Control-plane to Consul servers configuration을 참조하세요. list

control-plane 공유 볼륨 구성 (Control-plane shared volume configuration)

mountPoints 구성은 control-plane 컨테이너가 Envoy를 시작하는 데 필요한 Envoy bootstrap 구성 파일을 저장하는 볼륨과 경로를 정의합니다. 다음 키와 값을 지정해야 합니다:

"mountPoints": [
  {
    "readOnly": false,
    "containerPath": "/consul",
    "sourceVolume": "consul_data"
  },
  {
    "readOnly": true,
    "containerPath": "/bin/consul-inject",
    "sourceVolume": "consul_binary"
  }
],

control-plane에서 Consul 서버로 구성 (Control-plane to Consul servers configuration)

메시 작업 모듈이 control-plane 및 ECS controller 컨테이너가 서버에 연결하도록 구성할 수 있도록 Consul 서버 연결 설정을 제공하세요.

  1. variables.tf 파일에서 gRPC 및 HTTP 트래픽에 대한 호스트 URL과 TLS 설정용 변수를 정의합니다. 정의할 수 있는 변수에 대한 정보는 mesh task module reference를 참조하세요. 다음 예제에서 Consul 서버 주소는 consul_server_hosts 변수에 정의됩니다:
    variable "consul_server_hosts" {
      description = "Address of Consul servers."
      type        = string
    }
    
  2. control-plane 및 ECS controller 컨테이너 정의에 environment 블록을 추가합니다.
  3. environment.name 필드를 CONSUL_ECS_CONFIG_JSON 환경 변수로 설정하고 값을 local.encoded_config로 설정합니다.
    environment = [
      {
        name  = "CONSUL_ECS_CONFIG_JSON",
        value = local.encoded_config
      }
    ]
    

구성을 적용하면 mesh task 모듈이 서버 구성 변수를 보간하고, config.tf 파일을 빌드하고, 설정을 적절한 컨테이너에 주입합니다.

config.tf 파일에 대한 추가 정보는 JSON schema reference 문서를 참조하세요.

작업 정의 구성 등록 (Register the task definition configuration)

AWS Console, AWS CLI 또는 AWS가 지원하는 다른 방법을 사용하여 ECS 클러스터에 작업 정의를 등록하세요. 또한 작업 정의를 사용하여 작업을 시작하려면 ECS Service를 만들어야 합니다. 작업 정의 등록 방법에 대한 정보는 다음 ECS 문서를 참조하세요:

controller 컨테이너 배포 (Deploy the controller container)

controller 컨테이너는 별도의 ECS 작업에서 실행되며 Consul 보안 기능을 담당합니다. controller는 AWS IAM auth method를 사용하여 시작 시 ECS 작업이 자동으로 Consul ACL 토큰을 얻도록 합니다. 자세한 내용은 Consul security components를 참조하세요.

보안 구성 요구 사항에 설명된 사전 조건을 완료했는지 확인하고 다음 구성 요소를 구성하여 Consul 보안 기능을 활성화하세요.

  • ACL 정책
  • ECS 작업 역할
  • 서비스 토큰용 auth method

ACL 정책 만들기 (Create an ACL policy)

Consul 서버에서 controller에 대해 다음 액세스를 부여하는 정책을 만드세요:

이 정책을 통해 Consul이 정책에 연결된 토큰을 생성할 수 있습니다. 지침은 Create a service token을 참조하세요.

ECS 작업 역할 (ECS task role)

  1. ECS 작업 역할을 만들고 iam:GetRole 권한을 구성하여 스스로 가져올 수 있게 합니다. 지침은 IAM Policies을 참조하세요.
  2. 작업의 애플리케이션에 대한 Consul 서비스 이름이 포함된 consul.hashicorp.com.service-name 태그를 작업 역할에 추가합니다.
  3. Consul Enterprise를 사용할 때 서비스를 등록할 namespace를 지정하려면 consul.hashicorp.com.namespace 태그도 포함해야 합니다.

서비스 토큰용 auth method 구성 (Configure the auth method for service tokens)

Consul 서버에서 consul acl auth-method create 명령을 실행하여 서비스 토큰용 auth method 인스턴스를 만듭니다.

다음 예제 명령은 이 auth method 인스턴스에 로그인하는 동안 생성된 각 토큰에 서비스 아이덴티티를 연결하도록 auth method를 구성합니다.

$ consul acl auth-method create \
    -type aws-iam \
    -name iam-ecs-service-token \
    -description="AWS IAM auth method for ECS service tokens" \
    -config '{
  "BoundIAMPrincipalArns": ["arn:aws:iam::<ACCOUNT>:role/consul-ecs/*"],
  "EnableIAMEntityDetails": true,
  "IAMEntityTags": [
    "consul.hashicorp.com.service-name"
  ]
}'

특정 파티션에서 이러한 리소스를 만들려면 Consul CLI로 Consul ACL 역할, 정책, auth method 및 binding rule를 만들 때 -partition <partition-name> 옵션을 포함하세요.

명령에서 다음 플래그를 지정해야 합니다:

Flag Description Type
-type aws-iam이어야 합니다. String
-name auth method의 이름을 지정합니다. 모든 auth method에서 고유해야 합니다. String
-description auth method에 대한 설명을 지정합니다. String
-config auth method에 대한 구성을 포함하는 JSON 문자열입니다. 자세한 내용은 Auth method -config parameter을 참조하세요. String
-partition Enterprise auth method가 유효한 admin 파티션을 지정합니다. String

Auth method -config 매개변수 (Auth method -config parameter)

-config 플래그에서 다음 구성을 지정해야 합니다:

Flag Description Type
BoundIAMPrincipalArns 신뢰할 수 있는 IAM 역할 목록을 지정합니다. 특정 경로에서 IAM 역할을 신뢰하려면 와일드카드를 사용하는 것을 권장합니다. List
EnableIAMEntityDetails auth method가 역할 경로 및 역할 태그와 같은 IAM 역할 세부 정보를 검색할 수 있으려면 true여야 합니다. Boolean
IAMEntityTags 바인딩 규칙에 사용할 수 있도록 할 IAM 역할 태그 목록을 지정합니다. 서비스 이름 태그를 포함해야 합니다. List

자세한 내용은 auth method configuration parameters 문서를 참조하세요.

binding rule 만들기 (Create the binding rule)

Consul 서버에서 consul acl binding-rule create 명령을 실행하여 binding rule을 만듭니다. 이 규칙은 이 auth method 인스턴스에 대한 성공적인 로그인 시 생성된 각 토큰에 서비스 아이덴티티를 연결합니다.

다음 예제에서 Consul은 인증된 IAM 역할 아이덴티티에 대해 지정된 consul.hashicorp.com.service-name 태그에서 서비스 아이덴티티 이름을 가져옵니다.

$ consul acl binding-rule create \
   -method iam-ecs-service-token \
   -description 'Bind a service identity from IAM role tags for ECS service tokens' \
   -bind-type service \
   -bind-name '${entity_tags.consul.hashicorp.com.service-name}'

특정 파티션에서 이러한 리소스를 만들려면 Consul CLI로 Consul ACL 역할, 정책, auth method 및 binding rule를 만들 때 -partition <partition-name> 옵션을 포함해야 합니다.

시크릿 저장 구성 (Configure storage for secrets)

Consul Server CA 인증서를 보호하고 ECS 작업에서 사용할 수 있도록 저장하세요. Consul 프로토콜에 따라 둘 이상의 인증서가 필요할 수 있습니다. ECS 작업에 시크릿을 저장하고 전달하는 방법에 대한 지침은 다음 문서를 참조하세요:

저장된 시크릿은 ARN으로 참조할 수 있습니다. 예제는 AWS Secrets Manager에 저장된 시크릿의 ARN을 보여줍니다:

  • Consul Server CA Cert for RPC: arn:aws:secretsmanager:us-west-2:000000000000:secret:my-consul-ca-cert
  • Consul Server CA Cert for HTTPS: arn:aws:secretsmanager:us-west-2:000000000000:secret:my-consul-https-ca-cert

감사 로깅 구성 (Configure audit logging)

Enterprise

ECS 워크로드에 연결된 Consul 서버가 인증된 이벤트 로그를 캡처하도록 구성할 수 있습니다. 자세한 내용은 Audit Logging을 참조하세요.

다음 단계 (Next steps)

Consul 서비스 메시 인프라를 배포한 후에는 여전히 서비스 인스턴스 간 라우트를 정의하고 애플리케이션이 메시를 통해서만 트래픽을 수신하도록 바인드 주소를 구성해야 합니다. 다음 주제를 참조하세요:

더 알아보기 (Learn more)