Traefik AWS ECS 문서
Traefik AWS ECS 문서 (Traefik AWS ECS Documentation)
본문
Traefik & AWS ECS
구성 예시 (Configuration Example)
아래에서 설명하는 것처럼 ECS 프로바이더를 활성화할 수 있어요.
File (YAML)
providers:
ecs: {}
File (TOML)
[providers.ecs]
CLI
--providers.ecs=true
구성 옵션 (Configuration Options)
| Field | Description | Default | Required |
| providers.providersThrottleDuration | 구성 리로드 이후, 새로운 구성 갱신 이벤트를 반영하기까지 기다리는 최소 시간. 이 시간 안에 여러 이벤트가 발생하면 가장 최근 이벤트 하나만 반영되고 나머지는 모두 버려져요. 이 옵션은 프로바이더별로 설정할 수 없지만, 스로틀링 알고리즘은 각 프로바이더에 독립적으로 적용됩니다. | 2s | No |
| providers.ecs.autoDiscoverClusters | 클러스터 목록에서 서비스를 검색해요. true로 설정하면 모든 클러스터에 대해 서비스 디스커버리가 활성화됩니다. | false | No |
| providers.ecs.ecsAnywhere | ECS Anywhere 지원을 활성화해요. | false | No |
| providers.ecs.clusters | 클러스터 목록에서 서비스를 검색해요. autoDiscoverClusters가 true로 설정되면 이 옵션은 무시됩니다. | ["default"] | No |
| providers.ecs.exposedByDefault | ECS 서비스를 Traefik을 통해 기본적으로 노출해요. false로 설정하면 traefik.enable=true 라벨이 없는 컨테이너는 결과 라우팅 구성에서 무시됩니다. 자세한 내용은 여기를 참고하세요. | true | No |
| providers.ecs.constraints | Traefik이 컨테이너 라벨에 대해 대조하여 해당 컨테이너에 라우트를 만들지 여부를 결정하는 표현식. 자세한 내용은 여기를 참고하세요. | "" | No |
| providers.ecs.healthyTasksOnly | Traefik이 건강한 작업(HEALTHY healthStatus)만 발견할지 여부를 정의해요. | false | No |
| providers.ecs.defaultRule | 모든 서비스의 기본 호스트 규칙. 자세한 내용은 여기를 참고하세요. | "Host({{ normalize .Name }})" | No |
| providers.ecs.refreshSeconds | 폴링 간격(초)을 정의해요. | 15 | No |
| providers.ecs.region | ECS 인스턴스의 지역을 정의해요. 자세한 내용은 여기를 참고하세요. | "" | No |
| providers.ecs.accessKeyID | ECS 인스턴스의 Access Key ID를 정의해요. 자세한 내용은 여기를 참고하세요. | "" | No |
| providers.ecs.secretAccessKey | ECS 인스턴스의 Secret Access Key를 정의해요. 자세한 내용은 여기를 참고하세요. | "" | No |
constraints
constraints 옵션은 Traefik이 컨테이너(작업) 라벨에 대해 대조하여 해당 컨테이너에 라우트를 만들지 여부를 결정하는 표현식으로 설정할 수 있어요. 컨테이너 라벨 중 그 표현식과 일치하는 것이 없다면 그 컨테이너에 대한 라우트는 만들어지지 않아요. 표현식이 비어 있으면 발견된 모든 컨테이너가 포함됩니다.
표현식 문법은 아래 예시에서 보여주듯이 Label("key", "value"), LabelRegex("key", "value") 함수와 일반적인 불리언 논리에 기반해요.
제약 조건 키 제한 사항 (Constraints key limitations)
traefik.*는 구성을 위한 예약된 라벨 네임스페이스이며 커스텀 제약 조건의 키로 사용할 수 없다는 점을 유의하세요.
제약 조건 표현식 예시 (Constraints Expression Examples)
# Includes only containers having a label with key `a.label.name` and value `foo`
constraints = "Label(`a.label.name`, `foo`)"
# Excludes containers having any label with key `a.label.name` and value `foo`
constraints = "!Label(`a.label.name`, `value`)"
# With logical AND.
constraints = "Label(`a.label.name`, `valueA`) && Label(`another.label.name`, `valueB`)"
# With logical OR.
constraints = "Label(`a.label.name`, `valueA`) || Label(`another.label.name`, `valueB`)"
# With logical AND and OR, with precedence set by parentheses.
constraints = "Label(`a.label.name`, `valueA`) && (Label(`another.label.name`, `valueB`) || Label(`yet.another.label.name`, `valueC`))"
# Includes only containers having a label with key `a.label.name` and a value matching the `a.+` regular expression.
constraints = "LabelRegex(`a.label.name`, `a.+`)"
File (YAML)
providers:
ecs:
constraints: "Label(`a.label.name`,`foo`)"
# ...
File (TOML)
[providers.ecs]
constraints = "Label(`a.label.name`,`foo`)"
# ...
CLI
--providers.ecs.constraints="Label(`a.label.name`,`foo`)"
# ...
자세한 내용은 서비스 디스커버리 범위 제한(Restrict the Scope of Service Discovery)을 참고하세요.
defaultRule
defaultRule 옵션은 라벨로 규칙이 정의되지 않은 컨테이너에 적용할 라우팅 규칙을 정의해요.
유효한 Go 템플릿이어야 하며 sprig 템플릿 함수를 사용할 수 있어요. 컨테이너 서비스 이름은 Name 식별자로 접근할 수 있고, 템플릿은 이 컨테이너에 정의된 모든 라벨에 접근할 수 있어요.
File (YAML)
providers:
ecs:
defaultRule: "Host(`{{ .Name }}.{{ index .Labels \"customLabel\"}}`)"
# ...
File (TOML)
[providers.ecs]
defaultRule = "Host(`{{ .Name }}.{{ index .Labels \"customLabel\"}}`)"
# ...
CLI
--providers.ecs.defaultRule='Host(`{{ .Name }}.{{ index .Labels "customLabel"}}`)'
# ...
기본 규칙과 Traefik 서비스
Traefik 컨테이너의 노출은 기본 규칙 메커니즘과 결합될 때, 자기 자신을 대상으로 하는 라우터를 만들어 루프에 빠지게 할 수 있어요. 이 경우 무한 루프를 방지하기 위해 Traefik은 같은 라우터에서 온 요청이면 거부하는 내부 미들웨어를 추가합니다.
자격 증명 (Credentials)
이것은 ECS 인스턴스의 자격 증명을 정의해요.
region이 제공되지 않으면, EC2 작업의 경우 EC2 메타데이터 엔드포인트에서 해석됩니다. FARGATE 컨텍스트에서는 AWS_REGION 환경 변수에서 해석됩니다.
accessKeyID와 secretAccessKey가 제공되지 않으면 자격 증명은 다음 순서로 해석됩니다.
- AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN 환경 변수 사용
- AWS_PROFILE과 AWS_SHARED_CREDENTIALS_FILE로 결정되는 공유 자격 증명 사용(기본값은 default 및 ~/.aws/credentials)
- EC2 인스턴스 역할 또는 ECS 작업 역할 사용
File (YAML)
providers:
ecs:
region: us-east-1
accessKeyID: "abc"
secretAccessKey: "123"
# ...
File (TOML)
[providers.ecs]
region = "us-east-1"
accessKeyID = "abc"
secretAccessKey = "123"
CLI
--providers.ecs.region="us-east-1"
--providers.ecs.accessKeyID="abc"
--providers.ecs.secretAccessKey="123"
# ...
정책 (Policy)
Traefik이 ECS 정보를 읽으려면 다음 정책이 필요해요.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "TraefikECSReadAccess",
"Effect": "Allow",
"Action": [
"ecs:ListClusters",
"ecs:DescribeClusters",
"ecs:ListTasks",
"ecs:DescribeTasks",
"ecs:DescribeContainerInstances",
"ecs:DescribeTaskDefinition",
"ec2:DescribeInstances",
"ssm:DescribeInstanceInformation"
],
"Resource": [
"*"
]
}
]
}
ECS Anywhere
ssm:DescribeInstanceInformation 액션은 ECS Anywhere 인스턴스 발견에 필요하다는 점을 유의하세요.