Skip to main content

AWS ECR 인증 자동화 설정

Kyungmin Park

개요

CI/CD 작업 수행 시 Docker 이미지 빌드 후 ECR에 배포하게 됨

이후 EC2 또는 ECS에서 해당 이미지를 사용하게 되는데 EC2의 경우 빌드 한 이미지를 사용하는데 필요한 ECR 자격 증명이 필요하고 이를 Amazon ECR Docker Credential Helper 를 사용하여 자동화에 기여할 수 있는 방법에 대한 가이드

Amazon ECR Docker Credential Helper 설치 및 설정

  1. 설치
sudo dnf install -y amazon-ecr-credential-helper
  1. ~/.docker/config.json 파일 생성
{
	"credsStore": "ecr-login"
}
  1. Docker 서비스 재기동
sudo service docker restart

EC2에 할당할 IAM Role 생성 및 할당

ECR Private repository의 이미지를 pull 하기 위해 arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly 정책(Policy)을 가진 권한(IAM Role)을 생성 후 EC2 인스턴스에 할당

  • Terraform 코드 예시
# EC2
resource "aws_instance" "linux-instance" {
  ...
  iam_instance_profile            = aws_iam_instance_profile.ec2_profile.name
  ...
}

# EC2 IAM Role
resource "aws_iam_role" "ec2_role" {
  name = "cd-target-instance-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Sid    = ""
        Principal = {
          Service = "ec2.amazonaws.com"
        }
      },
    ]
  })
}

# EC2 SSM IAM profile
resource "aws_iam_instance_profile" "ec2_profile" {
  name = "ec2-profile"
  role = aws_iam_role.ec2_role.name
}

# IAM Policy(ECR ReadOnly)
resource "aws_iam_role_policy_attachment" "ecr_readonly_attach" {
  role       = aws_iam_role.ec2_role.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly"
}

EC2 인스턴스 메타데이터 옵션 사용

~/.aws/credentials의 인증정보를 사용하는 것이 아닌 IMDSv2를 사용하여 인스턴스에 할당된 메타데이터( IAM Role)를 통해 인증 하는 방식을 사용

  • AWS Console에서 직접 수정
    • Instance → Instance settings → Modify instance metadata options
  • Terraform 코드 예시
resource "aws_instance" "linux-instance" {
  ...
  metadata_options {              # https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html#imds-considerations
      http_endpoint               = "enabled"
      http_tokens                 = "required" # IMDSv2
      http_put_response_hop_limit = 2          # hop limit
      instance_metadata_tags      = "enabled"
    }
  ...
}

no basic auth credentials 오류 시

설정을 해도 인증 정보를 가져못하는 경우, 보통 인터넷에 연결 가능한 인스턴스가 해당 문제가 발생합니다.

[ec2-user@ip-1-1-1-1 temp]$ docker pull <AWS-ACCOUNT-ID>.dkr.ecr.ap-northeast-2.amazonaws.com/<PRIVATE-REPOSITORY-NAME>:<TAG>
Error response from daemon: Head "<AWS-ACCOUNT-ID>.dkr.ecr.ap-northeast-2.amazonaws.com/<PRIVATE-REPOSITORY-NAME>:<TAG>": no basic auth credentials
EC2 Windows 인스턴스에서 메타데이터에 접근할 수 없는 문제 해결 방법
본 기사는 EC2 Windows 인스턴스에서 메타데이터에 접근할 수 없는 문제가 발생되었을 때 이에 대한 해결 방법에 대해 설명합니다.

해결방법

메타데이터를 가져오는 서버 접근 시 Proxy를 사용하지 않도록 변경

EC2 인스턴스의 모든 유저가 로그인할 때마다 적용되도록 전역 profile.d에 스크립트 생성

echo 'export NO_PROXY="169.254.169.254,169.254.170.2,localhost,127.0.0.1"' > /etc/profile.d/proxy.sh
echo 'export no_proxy="169.254.169.254,169.254.170.2,localhost,127.0.0.1"' >> /etc/profile.d/proxy.sh
chmod +x /etc/profile.d/proxy.sh
  • Terraform 코드 예시
resource "aws_instance" "linux-instance" {
  ...
  user_data = <<-EOF
              #!/bin/bash
              echo 'export NO_PROXY="169.254.169.254,169.254.170.2,localhost,127.0.0.1"' > /etc/profile.d/proxy.sh
              echo 'export no_proxy="169.254.169.254,169.254.170.2,localhost,127.0.0.1"' >> /etc/profile.d/proxy.sh
              chmod +x /etc/profile.d/proxy.sh
              EOF
}