CodeBuild를 사용해 AssumeRole의 임시 보안 인증 정보를 Docker 런타임으로 전달하려면 어떻게 해야 하나요?

3분 분량
0

AWS CodeBuild를 사용해 AssumeRole의 임시 보안 인증 정보를 Docker 런타임에 전달하고 싶습니다.

간략한 설명

CodeBuild에서는 CodeBuild 서비스 역할을 빌드 컨테이너의 기본 AWS 보안 인증 정보로 사용합니다. 빌드 컨테이너 내에서 실행되는 Docker 런타임은 AWS 보안 인증 정보를 가져오지 않으므로 명시적으로 구성해야 합니다.

AssumeRole 보안 인증 정보를 환경 변수로 내보냅니다. 그 후 Docker 빌드를 위해 --build-arg 매개 변수를 사용해 해당 변수를 Docker 런타임에 전달합니다. 자세한 내용은 Docker Docs 웹사이트에서 Docker 빌드를 참조하세요.

해결 방법

  1. Docker 런타임의 새 역할을 생성합니다. 다음 예를 참고하세요. Secretassumerole

  2. Secretassumerole의 신뢰 관계 정책을 업데이트하고 위임 역할에 CodeBuild 서비스 역할 권한을 추가하세요. 다음 예를 참고하세요.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::$account_id:role/service-role/codebuild-service-role"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  1. 새 역할을 이용해 AWS Secrets Manager에서 비밀 AWSExampleSecret 값을 가져옵니다. 다음 예를 참고하세요.
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetResourcePolicy",
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret",
        "secretsmanager:ListSecretVersionIds"
      ],
      "Resource": [
        "arn:aws:secretsmanager:ap-northeast-1:$account_id:secret:tutorials/AWSExampleSecret-EHWYme"
      ]
    }
  ]
}

참고:****$account_id를 계정 ID로 바꿉니다. Docker 런타임 중에 어떤 작업 권한이든 부여할 수 있습니다.

  1. CodeBuild 서비스 역할에 sts:assumeRole 권한을 추가해 AssumeRole 작업을 허용합니다. 다음 예를 참고하세요.
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::$account_id:role:role/Secretassumerole"
    }
  ]
}
  1. 빌드 사양을 이용해 AssumeRole 보안 인증 정보를 환경 변수로 내보냅니다. 그 후 docker build 명령을 사용해 보안 인증 정보를 Docker 런타임에 전달합니다. 다음 예를 참고하세요.
version: 0.2
phases:
  install:
    runtime-versions:
      nodejs: 16
    commands:
      - ASSUME_ROLE_ARN="arn:aws:iam::$account_id:role/Secretassumerole"
      - TEMP_ROLE=$(aws sts assume-role --role-arn $ASSUME_ROLE_ARN --role-session-name test)
      - export TEMP_ROLE
      - export AWS_ACCESS_KEY_ID=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.AccessKeyId')
      - export AWS_SECRET_ACCESS_KEY=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.SecretAccessKey')
      - export AWS_SESSION_TOKEN=$(echo "${TEMP_ROLE}" | jq -r '.Credentials.SessionToken')

  pre_build:
    commands:
      - echo Build started on 'date'
      - echo Building the Docker image...
      - docker build . --build-arg AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID --build-arg AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY --build-arg AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN

참고:****--duration-seconds를 사용해 위임 역할의 최대 세션 시간을 설정할 수 있습니다. 이 프로세스에는 역할 체인이 포함되기 때문에 --duration-seconds 옵션에 최대값 3600초가 허용됩니다. 값을 3600초보다 높게 설정하면 작업이 실패합니다. 자세한 내용은 역할 용어 및 개념에서 역할 체인 섹션을 참고하세요.

  1. Dockerfile에서 이미지를 빌드할 때 AssumeRole 보안 인증 정보를 가져옵니다. 다음 예를 참고하세요.
FROM amazonlinux:latest
RUN yum -y install aws-cli
ARG AWS_ACCESS_KEY_ID
ARG AWS_SECRET_ACCESS_KEY
ARG AWS_SESSION_TOKEN
RUN echo $AWS_ACCESS_KEY_ID
RUN echo $AWS_SECRET_ACCESS_KEY
RUN echo $AWS_SESSION_TOKEN
RUN aws sts get-caller-identity
RUN aws secretsmanager get-secret-value --secret-id tutorials/AWSExampleSecret --region ap-northeast-1

**참고:**DOCKERFILE에 RUN aws secretsmanager get-secret-value --secret-id tutorials/AWSExampleSecret을 추가해 빌드에서 비밀을 가져올 수 있습니다. 경고: 이 작업 중 빌드 로그에 비밀이 노출될 수 있습니다.

출력:

Step 8/11 : RUN echo $AWS_ACCESS_KEY_ID
 ---> Running in 1a1b1c1d1e1f
AKIAIOSFODNN7EXAMPLE
Removing intermediate container 2a3b4c5d6e7f
 ---> 32a8170f9697
Step 9/11 : RUN echo $AWS_SECRET_ACCESS_KEY
 ---> Running in 3a3b3c3d3e3f
KJq+JNqmnNq1JirNUBkxc+kRVavgZwhpFFIJjxD6
Removing intermediate container 3a3b3c3d3e3f
 ---> 4a4b4c4d4e4f
Step 10/11 : RUN echo $AWS_SESSION_TOKEN
 ---> Running in 5a5b5c5d5e5f
FQoGZXIvYXdzEJP//////////wEaDPTjooaOAaU8NDj5oyKkAjVwT4uQHTZJdCtfOZxa6wTZVOy0Zkw+laN1RRVZhvhdPOWhU8VgK2d7ZgTlqaXn4NSrdWlnub6g5JobP4o509t3VLdMUR5ZJJcpnSlJAY5YM7vlPndroGcV+Y689ztVzQ1uVxdtpjQK1qh87fw6m0dHt7Q8Y8TferRNVvCM4kOroxPzovTbO6IkLDcBp8PhOVgtVtxEpON6nZrN990zzUmhXjT0vrtpDtAi339hhs7fzDOrnllQHSAmSerT0NhMOYVqBH1HJOq3FYnG+TUbHENpSq3kwTiPL2uoTw7/Ufrrgz4i3ENHm3rIWlbD8VuleDl5yhooKifmKDPjQAHs5HbVjD9lnxQFrCIuyvZdmsqzgoIjPt6z5H8lzugLHAAmbgiOwDoo+Oba7QU=
Removing intermediate container 5a5b5c5d5e5f
 ---> 0cc838f3c865
Step 11/11 : RUN aws sts get-caller-identity
 ---> Running in 6a6b6c6d6e6f
{
    "Account": "xxxxxxxxx",
    "UserId": "AIDACKCEVSQ6C2EXAMPLE:test",
    "Arn": "arn:aws:sts::$account_id:assumed-role/Secretassumerole/test"
}
Removing intermediate container 6d525393d667
 ---> 2da2f38adc77
Step 12/12 : RUN aws secretsmanager get-secret-value --secret-id tutorials/AWSExampleSecret --region ap-northeast-1
 ---> Running in 7a7b7c7d7e7f
{
    "Name": "tutorials/AWSExampleSecret",
    "VersionId": "1a23bb45-679c-1d2e-fg34-567891234hi5",
    "SecretString": "{\"username\":\"myserviceusername\",\"password\":\"yourPassword\"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1558616482.926,
    "ARN": "arn:aws:secretsmanager:ap-northeast-1:$account_id:secret:tutorials/M-EHWYme"
}
Removing intermediate container 8a8b8c8d8e8f
 ---> 9a9b9c9d9e9f
Successfully built 9a9b9c9d9e9f
AWS 공식
AWS 공식업데이트됨 일 년 전