본문 바로가기
관리자

Programming-[Infra]/Cloud-AWS

Deploy: ECR: Assume Role for CI w/ github workflow

728x90
반응형

https://brunch.co.kr/@topasvga/1201

필요성

AWS Assume Role을 적용하면 github으로 CI(Continuous Integration)를 위해 AWS 계정의 ACCESS_KEY, SECRET_KEY를 대체할 수 있다. 따라서 코드가 간결해진다.

 

관리자 입장에서는 특정 유저에게 IAM 권한 및 토큰을 발급해야하는 관리 요소가 줄어든다. 또한 Assume Role을 사용하는 위치 및 이력을 추적하여 관리할 수 있게 된다.

 

개념

Assume Role은 임시로 특정 역할을 가정하여 제한된 권한만 주는 방식이다. github에 적용한다면 github의 특정 레포지토리에 assume-role을 주고, 해당 role은 특정 AWS 리소스의 특정 역할만 사용가능하도록 설정해줄 수 있다. 예를 들어 AWS Assume Role을 하나 만들고, github 레포를 연결한 다음 그 계정에는 ecr:DescribeImages 권한만 준다면 해당 Assume Role은 ECR의 이미지를 조회할 수 있는 권한만 얻게 되는 것이다.

 

이 글에서는 AWS 설정 내용은 생략하고 개발자의 관점에서 CI에 어떻게 적용하는지 예시를 적는다.

 

CI 구현 예시

 

name: Build and Push Docker Image to ECR

on:
  push:
    branches:
      - develop

permissions:
  id-token: write
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest

    env:
      AWS_ROLE_ARN: ${{ secrets.AWS_ROLE_ARN }}
      AWS_ECR_REPOSITORY_URI: ${{ secrets.AWS_ECR_REPOSITORY_URI }}
      AWS_REGION: ${{ secrets.AWS_REGION }}

    steps:
      - name: Check out code
        uses: actions/checkout@v2

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ env.AWS_ROLE_ARN }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Log in to Amazon ECR
        run: |
          aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ECR_REPOSITORY_URI


      - name: Build and Push Docker Image
        ...

 

 

위 코드는 github actions의 workflow 예시 코드이다.

 

  • develop 브랜치에 푸시했을 때 CI가 작동한다.
  • github secrets에 AWS_ROLE_ARN, AWS_ECR_REPOSITORY_URI, AWS_REGION 값을 시크릿 값으로 불러온다.
  • persmission 설정은 아래의 기능을 한다.
    • id-token:write - github Actions 워크플로우가 AWS와 같은 서비스에 접근하기 위해 OIDC(OpenID Connect) 토큰을 발급하고 클라우드 리소스에 접근할 수 있도록 한다.
    • contents:read - 해당 리포지토리의 파일에 접근하여 특정 브랜치의 파일을 다운로드, 출력하는 등에 사용할 수 있다.

 

 

위와 같이 적용 시, Assume Role을 통해 간결한 CI 코드가 작성될 수 있다.

728x90
반응형