CodeBuild를 사용하여 AssumeRole에 대한 임시 자격 증명을 Docker 런타임으로 전달하려면 어떻게 해야 하나요?
최종 업데이트 날짜: 2022년 5월 17일
AWS CodeBuild를 사용하여 AssumeRole의 임시 자격 증명을 Docker 런타임으로 전달하고 싶습니다.
간략한 설명
CodeBuild는 CodeBuild 서비스 역할을 빌드 컨테이너 및 Docker 런타임에서 기본 AWS 자격 증명으로 사용합니다.
AssumeRole 자격 증명을 환경 변수로 내보냅니다. 그런 다음 docker build용 --build-arg 파라미터를 사용하여 해당 변수를 Docker 런타임에 전달합니다. 자세한 내용은 Docker Docs 웹 사이트에서 docker build를 참조하세요.
해결 방법
1. Docker 런타임에 대한 새 역할을 만듭니다. 예: Secretassumerole
2. 새 역할을 사용하여 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 런타임 중에 모든 작업 권한을 부여할 수 있습니다.
3. 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"
}
]
}
4. 빌드 사양을 사용하여 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
- 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 옵션은 1시간에서 12시간까지의 값을 허용합니다. 12시간보다 큰 값을 설정하면 작업이 실패합니다.
5. 이미지를 빌드할 때 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
참고: 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