GitHub Actions에서 Azure Blob Storage로 파일 배포하기
개발 •
![GitHub Actions에서 Azure Blob Storage로 파일 배포하기](https://cdn-t.marshallku.com/images/images/2024/07/azcopy.png)
최근 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
란 도구가 원래 사용되고 있었단 사실이나, 로그인 처리 과정에 대한 문서 간 연결이 부족해 시간이 조금 걸렸네요.
이런 이상한 작업을 하는 분이 있을까 싶긴 하지만, 망망대해를 헤매는 분들에게 조금이나마 도움이 되길 바라며 글을 마칩니다.