AWS CodeBuild를 사용하여 AssumeRole의 임시 자격 증명을 Docker 런타임으로 전달하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 9월 24일

AWS CodeBuild를 사용하여 AssumeRole의 임시 자격 증명을 Docker 런타임으로 전달하고 싶습니다.

간략한 설명

CodeBuild는 CodeBuild 서비스 역할을 빌드 컨테이너 및 Docker 런타임에서 기본 AWS 자격 증명으로 사용합니다.

AssumeRole 자격 증명을 환경 변수로 내보냅니다. 그런 다음 docker build --build-arg 파라미터를 사용하여 해당 변수를 Docker 런타임에 전달합니다. 자세한 내용은 Docker Docs 웹 사이트에서 docker build를 참조하십시오.

​해결 방법

1.    Docker 런타임에 대한 새 역할(예: Secretassumerole)을 생성하십시오. 그런 다음, 새 역할을 사용하여 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"
            ]
        }
    ]
}

참고: Docker 런타임 중에 모든 작업 권한을 부여할 수 있습니다.

2.    sts:assumeRole 권한을 CodeBuild 서비스 역할에 추가하여 AssumeRole 작업을 허용하십시오. 예:

{
    "Version": "2012-10-17",
    "Statement": [
            {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::$account_id:role:role/Secretassumerole"
        }
    ]
}

3.    빌드 사양을 사용하여 AssumeRole 자격 증명을 환경 변수로 내보내십시오. 그런 다음, docker build 명령을 사용하여 자격 증명을 Docker 런타임으로 전달하십시오. 예:

version: 0.2
phases:
  install:
    runtime-versions:
      nodejs: 8
    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
      - echo $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')
      - echo $AWS_ACCESS_KEY_ID
      - echo $AWS_SECRET_ACCESS_KEY
      - echo $AWS_SESSION_TOKEN
  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 옵션은 1시간에서 12시간까지의 값을 허용합니다. 12시간보다 큰 값을 설정하면 작업이 실패합니다.

4.    이미지를 빌드할 때 Dockerfile에서 AssumeRole 자격 증명을 가져오십시오. 예:

FROM amazonlinux:latest
RUN yum -y install aws-cli 
ARG AWS_DEFAULT_REGION 
ARG AWS_ACCESS_KEY_ID 
ARG AWS_SECRET_ACCESS_KEY 
ARG AWS_SESSION_TOKEN 
RUN echo $AWS_DEFAULT_REGION 
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

참고: 임시 자격 증명을 인쇄하는 echo 문을 buildspec 및 Dockerfile에서 제거 할 수 있습니다.

다음과 유사한 출력이 표시됩니다.

Step 8/11 : RUN echo $AWS_ACCESS_KEY_ID 
 ---> Running in 7349ee896c1a 
ASIAWNOF2TBWYN3DC7RX 
Removing intermediate container 7349ee896c1a 
 ---> 32a8170f9697 
Step 9/11 : RUN echo $AWS_SECRET_ACCESS_KEY 
 ---> Running in 9f16f1252d93 
KJq+JNqmnNq1JirNUBkxc+kRVavgZwhpFFIJjxD6 
Removing intermediate container 9f16f1252d93 
 ---> 91fe8de3d301 
Step 10/11 : RUN echo $AWS_SESSION_TOKEN 
 ---> Running in 12ddfe17d5de 
FQoGZXIvYXdzEJP//////////wEaDPTjooaOAaU8NDj5oyKkAjVwT4uQHTZJdCtfOZxa6wTZVOy0Zkw+laN1RRVZhvhdPOWhU8VgK2d7ZgTlqaXn4NSrdWlnub6g5JobP4o509t3VLdMUR5ZJJcpnSlJAY5YM7vlPndroGcV+Y689ztVzQ1uVxdtpjQK1qh87fw6m0dHt7Q8Y8TferRNVvCM4kOroxPzovTbO6IkLDcBp8PhOVgtVtxEpON6nZrN990zzUmhXjT0vrtpDtAi339hhs7fzDOrnllQHSAmSerT0NhMOYVqBH1HJOq3FYnG+TUbHENpSq3kwTiPL2uoTw7/Ufrrgz4i3ENHm3rIWlbD8VuleDl5yhooKifmKDPjQAHs5HbVjD9lnxQFrCIuyvZdmsqzgoIjPt6z5H8lzugLHAAmbgiOwDoo+Oba7QU= 
Removing intermediate container 12ddfe17d5de 
 ---> 0cc838f3c865 
Step 11/11 : RUN aws sts get-caller-identity 
 ---> Running in 98b7c2f07621 
{ 
    "Account": “xxxxxxxxx”,  
    "UserId": "AROAWNOF2TBWS3TGMQRV3: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 c8ac00304416 
{ 
    "Name": "tutorials/AWSExampleSecret",  
    "VersionId": "3f37aa26-691e-4b4b-ad80-861680464cb9",  
    "SecretString": "{\"username\":\"myserviceusername\",\"password\":\"MyVerySecureP@ssw0rd!\"}",  
    "VersionStages": [ 
        "AWSCURRENT" 
    ],  
    "CreatedDate": 1558616482.926,  
    "ARN": "arn:aws:secretsmanager:ap-northeast-1:$account_id:secret:tutorials/M-EHWYme" 
} 
Removing intermediate container c8ac00304416 
 ---> c3be32e39b0e 
Successfully built c3be32e39b0e

이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?