본문 바로가기

개발하자

ECS Fargate 및 Terraform으로 개인 도커 레지스트리 액세스

반응형

ECS Fargate 및 Terraform으로 개인 도커 레지스트리 액세스

가능한 경우 간단한 토큰이나 사용자:비밀번호를 사용하여 개인 도커 레지스트리의 자격 증명을 포함하려면 ECS 작업 정의가 필요합니다.

아래는 제 코드입니다:

resource "aws_secretsmanager_secret" "docker_registry_secret" {
  name_prefix = "/my_environment/registry/pwd"
}

resource "aws_secretsmanager_secret_version" "docker_registry_secret_version" {
  secret_id     = aws_secretsmanager_secret.docker_registry_secret.id
  secret_string = xxxMYTOKENxxx
}

resource "aws_iam_role_policy" "password_policy_secretsmanager" {
  name = "${var.task_name}-secretsmanager"
  role = aws_iam_role.MY_ECS_ROLE.id

  policy = <<-EOF
  {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Action": [
          "secretsmanager:GetSecretValue"
        ],
        "Effect": "Allow",
        "Resource": [
          "${aws_secretsmanager_secret.docker_registry_secret.arn}",
        ]
      }
    ]
  }
  EOF
}

resource "aws_ecs_task_definition" "task_to_be_scheduled" {
  .....
  ....
  requires_compatibilities = ["FARGATE"]
  network_mode             = "awsvpc"
  container_definitions = jsonencode([
    {
      "repositoryCredentials" : {
        "credentialsParameter" : aws_secretsmanager_secret.docker_registry_secret.arn
      },
      ....
      ....
  ])
}

그러나 작업을 시작할 때 ECS에서 다음과 같은 오류가 발생합니다:

저는 그 오류가 비밀 관리자와 관련이 있다고 확신하지만, 정확한 위치는 모르겠습니다. 내가 뭘 잘못하고 있는지 알아?




이 대답이 다른 사람에게 도움이 되었으면 좋겠습니다. 내가 두가지 실수를 했어요:

  1. 내 작업 정의에서, 나는 execution_role_arn 필드만 설정했다. task_role_arn을 추가하는 것을 잊었습니다.
# before

resource "aws_ecs_task_definition" "task_to_be_scheduled" {
  execution_role_arn       = aws_iam_role.ecs_role.arn
  ....
}

# after

resource "aws_ecs_task_definition" "task_to_be_scheduled" {
  execution_role_arn       = aws_iam_role.ecs_role.arn
  task_role_arn            = aws_iam_role.ecs_role.arn
  ....
}
  1. {"username": "gitlab-ci-token", "password": "your-password"} 대신 토큰을 credentialParameter로 사용하고 있었습니다
# before

container_definitions = jsonencode([
    {
      "repositoryCredentials" : {
        "credentialsParameter" : "any-token-as-string"
      },
   ....
}]

# after

container_definitions = jsonencode([
    {
      "repositoryCredentials" : {
        "credentialsParameter" : {"username" : "gitlab-ci-token", "password" : "your-password"}
      },
   ....
}]



다음을 사용한 후에도 비슷한 문제가 발생했습니다:

"repositoryCredentials": {
        "credentialsParameter": {"username" : "xx" , "password" : "xxxxx"} 
        },

넥서스 저장소로 인증하려고 합니다.

오류: ECS 작업 정의 컨테이너_정의가 잘못되었습니다: JSON 디코딩 오류: json: Go struct 필드 RepositoryCredentials로 개체 마셜을 해제할 수 없습니다.리포지토리 자격 증명.자격 증명 문자열의 매개 변수




repositoryCredentials": {
    "credentialsParameter": "arn:aws:secretsmanager:us-east-1:xxxxx:secret:NexusContainerRegistryAccess-yVnAfJ"
    },

나는 시크릿 매니저를 이용해서 해결했다


반응형