GitHub Actions에서 Azure Blob Storage로 파일 배포하기

개발

GitHub Actions에서 Azure Blob Storage로 파일 배포하기
최종 수정일:

최근 AWS에서 Azure로 마이그레이션 하는 작업을 진행하고 있습니다.
AWS SDK도 제거해야 하고, ECR, EKS 등에서 ACR, AKS로 변경해야 하며, CI/CD 파이프라인도 모조리 손봐야 한다는 뜻입니다.

파이프라인 작업 중, 프론트엔드 애플리케이션 중 AWS S3에 배포된 애플리케이션을 Azure Blob Storage로 옮기는 작업 중 사소한 문제가 하나 발생했습니다.
AWS S3를 사용할 땐 aws s3 sync를 사용해 aws s3 sync --delete --region ap-northeast-2 ./out/ s3://YOUR_BUCKET와 같이 빌드된 결과를 S3로 동기화할 수 있었습니다.
Azure에도 az storage blob sync라는 명령어가 있지만, 몹시 안타깝게도 preview 단계라 사용할 수 없었습니다.

MS의 다른 동기화 가이드를 참고해 보시면, AzCopy란 도구를 사용해 동기화를 진행하는 것을 확인할 수 있습니다.

AKS등 활발하게 관리하는 서비스들과 달리, GitHub Actions에는 별도의 공식 지원이 없어서 여러 시행착오 끝에 만든 결과를 공유하고자 합니다.

Composite Action 추가

name: AzCopy
description: Download and Make azcopy executable
 
inputs:
    credentials:
        description: "Azure credentials"
        required: false
        default: ""
 
runs:
    using: composite
    steps:
        - name: Download file
          shell: bash
          run: wget -c https://aka.ms/downloadazcopy-v10-linux -O - | tar -xz
        - name: Move AzCopy
          shell: bash
          run: mv azcopy_linux_amd64_*/azcopy /usr/local/bin/
        - name: Set Credentials
          shell: bash
          if: ${{ inputs.credentials != '' }}
          env:
              AZURE_CREDENTIALS: ${{ inputs.credentials }}
          run: |
              echo "::add-mask::$AZURE_CREDENTIALS"
 
              AZCOPY_SPA_APPLICATION_ID=$(echo "$AZURE_CREDENTIALS" | jq -r '.clientId')
              AZCOPY_SPA_CLIENT_SECRET=$(echo "$AZURE_CREDENTIALS" | jq -r '.clientSecret')
              AZCOPY_TENANT_ID=$(echo "$AZURE_CREDENTIALS" | jq -r '.tenantId')
 
              echo "::add-mask::$AZCOPY_SPA_APPLICATION_ID"
              echo "::add-mask::$AZCOPY_SPA_CLIENT_SECRET"
              echo "::add-mask::$AZCOPY_TENANT_ID"
 
              echo "AZCOPY_AUTO_LOGIN_TYPE=SPN" >> "$GITHUB_ENV"
              echo "AZCOPY_SPA_APPLICATION_ID=$AZCOPY_SPA_APPLICATION_ID" >> "$GITHUB_ENV"
              echo "AZCOPY_SPA_CLIENT_SECRET=$AZCOPY_SPA_CLIENT_SECRET" >> "$GITHUB_ENV"
              echo "AZCOPY_TENANT_ID=$AZCOPY_TENANT_ID" >> "$GITHUB_ENV"

다운로드하고 설치하는 부분은 .tar 파일을 다운로드한 후 바이너리 파일을 /usr/local/bin에 옮기는 간단한 작업입니다.

문제는 az login을 통해 로그인된 상태여도 azcopy에서는 인증 정보를 가져오지 않는다는 것입니다.
install-azcopy라는 Action을 보니 환경 변수를 설정해 로그인을 처리하고 있어, AzCopy v10 configuration settings 문서를 확인해 보니 몇몇 환경 변수를 설정하면 자동으로 로그인이 가능하다는 것을 확인할 수 있었습니다.

이미 GitHub Actions에서 로그인을 위해 az ad sp create-for-rbac를 통해 Service Principal을 생성해 뒀기에, 해당 정보를 파싱해 필요한 값들을 환경 변수로 설정하도록 했습니다.
외부에 노출되면 안되는 정보를 넘기고 있으니, ::add-mask::를 통해 마스킹 처리하는 걸 잊어서는 안 됩니다.

배포 스크립트 추가

위 과정을 통해 Composite Action 구성을 마쳤다면, 이제 사용 방법은 굉장히 간단합니다.

- name: Setup AzCopy
  uses: org/actions/setup-azcopy@main
  with:
      credentials: ${{ secrets.AZURE_CREDENTIALS }}
- name: Deploy
  run: azcopy sync './out/' 'https://YOURSTORAGEACCOUNT.blob.core.windows.net/$web' --recursive --exclude-pattern="sub-dir/*

위와 같이 두 단계만으로 배포를 진행할 수 있습니다.

마무리

MS에서 관리하는 도구들이라 문서가 잘 되어 있어 짧은 시행착오로 마무리할 수 있었으나, azcopy란 도구가 원래 사용되고 있었단 사실이나, 로그인 처리 과정에 대한 문서 간 연결이 부족해 시간이 조금 걸렸네요.
이런 이상한 작업을 하는 분이 있을까 싶긴 하지만, 망망대해를 헤매는 분들에게 조금이나마 도움이 되길 바라며 글을 마칩니다.

Report an issue