github action을 돌릴 때 AWS 자격증명을 하고 싶은 경우 (ex - ECR, S3) 지금까지는 ACCESS KEY만 박아서 사용했었는데,
OIDC를 통해 액세스 키 없이 롤 방식으로도 구성할 수 있었다.
(회사에서 github action을 쓸 땐 항상 self hosted runner로만 했었어서 이런 방법이 있는 줄도 몰랐다.)
공식 문서들
- AWS : https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html
즉, github의 특정 org나 repo에서 사용할 수 있는 IAM role을 생성하고, 그를 github action에 적용할 수 있는 것.
그럼 한 번 직접 만들어 보자.
1. AWS 에서 github용 Identity Provider 만들기
AWS Console > IAM > Identity providers > Add provider
- OpenID Connect 선택
- Provider URL : `https://token.actions.githubusercontent.com`
- Audience : `sts.amazonaws.com`
이후 Add provider
끝
2. 1번에서 만든 OIDC 공급자를 신뢰하는 IAM Role 만들기
AWS Console > IAM > Roles > Create role
- Web Identity 선택
(드롭박스에서 선택)
- Identity provider : `token.actions.githubusercontent.com`
- Audience : `sts.amazonaws.com`
(직접 작성)
- Github organization : 자격증명을 허용할 github org 이름
- (optional) Github repository : 자격증명을 허용할 github repo 이름
- (optional) Github branch : 자격증명을 허용할 github branch 이름
이후 Next
이후 해당 org, repo에 원하는 권한을 붙여준 후 생성하면 끝이다.
위와 같이 생성한 경우, Trush relationship은 아래와 같이 만들어진다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::{ACCOUNT ID}:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:suminhong/*:*"
}
}
}
]
}
3. 2번에서 만든 role을 github action에서 사용해보기
2번에서 만든 Role의 ARN이 필요하다.
region과 session name은 원하는대로 설정 후, 아래처럼 configure-aws-credentials 액션을 사용할 수 있다.
그리고 `permissions` 부분을 꼭 넣어줘야 한다. 저게 없으면 OIDC 토큰을 요청조차 못하기 때문에 에러가 난다.
env:
AWS_REGION: ap-northeast-2
AWS_ROLE_ARN: arn:aws:iam::12345678:role/role-name
AWS_ROLE_SESSION_NAME: session-name
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: configure aws credentials
uses: aws-actions/configure-aws-credentials@v1
with:
role-to-assume: ${{ env.AWS_ROLE_ARN }}
role-session-name: ${{ env.AWS_ROLE_SESSION_NAME }}
aws-region: ${{ env.AWS_REGION }}
끝
참조
- https://goonerholic.github.io/github-actions-oidc
'공부 > AWS' 카테고리의 다른 글
[AWS] 콘솔 상단 색 변경 Extension (0) | 2025.01.19 |
---|---|
[aws-load-balancer-controller] failed calling webhook "mtargetgroupbinding.elbv2.k8s.aws" (0) | 2024.07.17 |
[AWS/EC2] Proxy Setup user_data (Linux, Windows) (0) | 2024.07.09 |
[AWS EKS] 보안그룹 최소 필요사항 정리 (0) | 2024.07.01 |
[Terraform/AWS ECR] 외부 이미지 ECR에 캐싱하기 (Pull Through Cache Rule) (0) | 2024.06.30 |
댓글