picture
  1. AWS Elastic Container Registry

GitHub Actions의 workflow를 통해 소스 코드의 변경 사항을 저장소에 반영하면 AWS ECR 저장소의 이미지를 업데이트하고 이를 클라우드타입에 배포하도록 파이프라인을 구성할 수 있습니다. GitHub Actions의 사용 방법은 🔗GitHub 에서 제공하는 가이드/문서에서 확인할 수 있으며, CI/CD 파이프라인과 관련된 설명은 🔗Cloudtype with Github Actions의 포스트를 참고해주세요.

준비사항

AWS IAM 생성 및 Access Key 발급하기

AWS의 IAM 콘솔에서 액세스 관리 > 사용자 페이지에 접속한 후 사용자 추가 버튼을 누릅니다.

희망하는 사용자 이름을 작성 후 다음으로 넘어갑니다.

권한 옵션에서 직접 정책 연결을 선택하고 AmazonEC2ContainerRegistryFullAccess를 검색하여 체크박스에 체크한 후 다음으로 넘어갑니다.

별도 설정 없이 사용자 생성 버튼을 누릅니다.

생성된 사용자 페이지에서 콘솔 로그인의 콘솔 로그인 활성화 버튼을 누릅니다.

콘솔 엑세스 항목에서 활성화를 선택하고 암호 설정에서 사용자 지정 암호를 선택한 후 사용할 암호를 입력합니다.

표시된 콘솔 로그인 URL은 추후 실제 컨테이너 레지스트리를 생성할 때 사용되므로 잘 저장해놓습니다.

다음은 해당 사용자에 대한 액세스 키를 발급하도록 하겠습니다. 액세스 키 만들기 버튼을 클릭합니다.

AWS 외부에서 실행되는 애플리케이션을 선택합니다.

적당한 설명 태그 값을 작성 후 액세스 키 만들기 버튼을 누릅니다.

발급된 액세스 키와 비밀 액세스 키를 안전한 곳에 저장합니다.

AWS ECR 저장소 생성 및 접속 토큰 발급하기

콘솔 로그인 URL을 통해 생성했던 사용자 계정으로 로그인합니다.

리포지토리 생성 화면에서 표시 여부를 프라이빗으로 선택하고 적절한 이름의 리포지토리 이름을 작성한 후 리포지토리 생성 버튼을 누릅니다.

표시한 URI에서 '/' 이하를 제외한 [ID].dkr.ecr.ap-northeast-2.amazonaws.com 부분을 기록해놓습니다.

저장소 접근을 위한 토큰 발급을 위해 위 명령어를 터미널에 입력하여 AWS CLI를 설치합니다.

curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /

명령어를 입력하여 액세스 키, 시크릿 액세스 키, 리전을 세팅합니다.

aws configure

명령어를 입력하여 ECR 리포지토리 URI에 접근하기 위한 토큰을 발급하고 이를 안전한 곳에 저장합니다.

aws ecr get-login-password --region ap-northeast-2

클라우드타입에 접속 주소 및 Access Key 등록하기

클라우드타입에 로그인 후, 환경설정의 통합 기능 페이지로 접속합니다. 이어 컨테이너 저장소 항목의 컨테이너 저장소 연결하기 버튼을 누릅니다.

레지스트리는 AWS Elastic Container Registry를 선택하고 접속주소에는 이전 단계에서 기록해두었던 ECR URI를, 비밀번호에는 aws ecr get-login-password… 명령어로 발행한 토큰 값을 입력하고 연결하기 버튼을 누릅니다.

클라우드타입 API 키 발급하기

클라우드타입 환경설정의 인증 페이지로 접속합니다. 이어 API 키 항목의 새로운 API 키 생성버튼을 누릅니다.

생성된 API 키 값을 안전한 곳에 보관합니다. 토큰은 생성 당시 최초 1회에 한해 조회할 수 있으며, 팝업창을 닫으면 다시 조회가 불가능합니다.

GitHub 저장소 secret 설정하기

GitHub Actions와 AWS ECR을 연동하기 위해서는 workflow 명세에서 AWS 계정 정보를 참조할 수 있도록 GitHub 저장소에 secret을 등록해야 합니다. Settings > Secrets and variables > Actions 페이지로 접속 후 New repository secret 버튼을 클릭합니다.

등록해야할 secret은 다음과 같습니다.

  • AWS_ECR_REGISTRY: AWS ECR Registry 주소(리포지토리 경로 제외)
  • AWS_ACCESS_KEY_ID: AWS 액세스 키 ID
  • AWS_SECRET_ACCESS_KEY: AWS 시크릿 액세스 키
  • CLOUDTYPE_TOKEN: 클라우드타입 API 키

Workflows 적용

액션별 참고 사항

1. docker/metadata-action

생성될 컨테이너 이미지의 메타 정보를 설정합니다.

  • 속성
    • images: 이미지명 (필수)
    • tags: 이미지 태그 (필수)
      • SHA를 태그로 설정하는 type=sha 옵션 사용을 권장

2. docker/build-push-action

도커 이미지를 빌드하고 정의된 이미지 레지스트리에 반영합니다.

  • 속성
    • tags: [이미지명]:[이미지 태그] (필수)
      • ${{ steps.meta.outputs.tags }} 형식으로 참조
    • labels: 이미지 레이블 (필수)
      • ${{ steps.meta.outputs.labels }} 형식으로 참조

3. cloudtype-github-actions/deploy

배포 설정을 클라우드타입에 전송하고 배포를 요청합니다.

  • 속성
    • token: 클라우드타입 API Key (필수)
    • project: 배포할 프로젝트명 (필수)
    • endpoint: 클라우드타입 API Endpoint (선택)
    • repo: GitHub 저장소 (선택) / 기본값 : 현재 액션이 동작중인 저장소
    • stage: 배포할 배포환경 (선택) / 기본값 : 기본 배포환경
    • allstages: 모든 배포환경에 배포 (선택) / 기본값 : false
    • file: 배포 설정 파일의 저장소 위치 (선택) / 기본값 : .cloudtype/app.yaml 혹은 cloudtype.yaml
    • json: 배포 설정 JSON 텍스트 (선택)
    • yaml: 배포 설정 Yaml 텍스트 (선택)

Workflow 설정하기

Workflow 설정 템플릿

  • .github/workflows/(파일명).yml

    name: Create and publish a Docker image to AWS ECR, Deploy to Cloudtype
    on:
    push:
    branches:
    - main
    env:
    REGISTRY: ${{ secrets.AWS_ECR_REGISTRY }}
    IMAGE_NAME: [이미지명]
    jobs:
    build-and-push-image:
    runs-on: ubuntu-latest
    permissions:
    contents: read
    steps:
    - name: Checkout repository
    uses: actions/checkout@v3
    - name: Log in to the Container registry
    uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
    with:
    registry: ${{ env.REGISTRY }}
    username: ${{ secrets.AWS_ACCESS_KEY_ID }}
    password: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
    - name: Extract metadata (tags, labels) for Docker
    id: meta
    uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
    with:
    images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
    tags: |
    type=sha
    - name: Build and push Docker image
    uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
    with:
    context: .
    push: true
    tags: ${{ steps.meta.outputs.tags }}
    labels: ${{ steps.meta.outputs.labels }}
    - name: Deploy to Cloudtype
    uses: cloudtype-github-actions/deploy@v1
    with:
    token: ${{ secrets.CLOUDTYPE_TOKEN }}
    project: [스페이스명]/[프로젝트명]
    stage: main
    yaml: |
    name: [서비스명]
    app: container
    options:
    ports: [포트번호]
    image: ${{ steps.meta.outputs.tags }}

    배포하고자 하는 GitHub 저장소에 위와 같이 GitHub Actions Workflows 명세를 세팅합니다. 다음의 항목은 환경에 맞게 변경하여 적용해야 합니다.

    • 이미지명
    • 스페이스명
    • 프로젝트명
    • 서비스명
    • 포트번호

workflows 명세를 GitHub 저장소에 커밋하면 GitHub Actions가 실행됩니다. 저장소의 Actions 탭으로 들어가 해당 Jobs가 잘 실행되었는지 확인합니다.

GitHub Actions를 통해 빌드된 이미지가 위와 같이 AWS ECR에 잘 반영된 것을 볼 수 있습니다.

workflows에서 설정한 클라우드타입 스페이스 내 프로젝트에 접속하면 해당 어플리케이션이 정상 배포되었음을 확인할 수 있습니다.


가이드 영상

AWS ECR 연동

사용에 문제나 어려움이 있다면 디스코드 채널에서 문의하세요.
디스코드 링크