해당 글은 Github OIDC 적용 방법에 대해서만 중점적으로 작성하였습니다.
Github Actions에서 서비스 배포를 위해 AWS에 접근 시 access-key, secret-key로 인증을 하는 경우가 있습니다.
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
그러나 access-key, secret-key를 github secrets변수로 저장해서 안전하게 보관하고 IAM 권한 범위를 적절히 지정하더라도 한 번쯤 찜찜하다고 생각한 적이 있을 것입니다.(Github 가 털린다거나 Github 가 털린다거나Github 가 털린다거나)
애초에 AWS 에서도 access key, secret key 사용을 지양하라고 하고 있습니다. (access key를 잃어먹는다거나, 털린다거나...)
그래서 이번에는 access Key 대신 Github OIDC를 활용하여 AWS 에 접근하기로 하였습니다.
OIDC를 통해 장기적인 자격 증명 대신, 수명이 짧은 액서스 토큰을 발급받는 방식으로 진행됩니다.
작동 순서
AWS IAM -> 역할 -> 역할 생성 으로 들어갑니다.
웹 자격 증명을 선택한 후, 자격증명 공급자에 token.actions.githubusercontent.com
을 입력, Audience에 sts.amazonaws.com
입력, Github 조직 및 repository에 해당하는 organization 과 repository 명을 적으면 됩니다.
이후 해당 계정에 사용할 권한을 추가하거나 Role 생성 후 다시 추가해도 됩니다.
저같은 경우 EC2로 특정 파일을 전송하기 위해(scp) 보안그룹에 22번 포트 Github Actions IP를 추가하고 작업이 끝나면 삭제하기 위해 Role 생성 이후 권한 추가를 통해 권한을 연결해주었습니다.
이후 만든 Role의 ARN 을 따로 기억해둡니다.
Github Actions를 사용할 레포지토리에 들어가 Settings -> Secrets and variables -> Actions 로 들어갑니다.
이후 이전에 기억해두었던 ARN을 저장합니다.
이제 AWS에 인증 과정을 gradle.yml에 작성하면 됩니다.
...
CD:
needs: [CI]
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
aws-region: ${{ secrets.AWS_REGION }}
이전에 저장해둔 ARN을 role-to-assume에 입력하고 aws region도 작성하면 됩니다.