# Azure # GitHub Actions

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란 도구가 원래 사용되고 있었단 사실이나, 로그인 처리 과정에 대한 문서 간 연결이 부족해 시간이 조금 걸렸네요.
이런 이상한 작업을 하는 분이 있을까 싶긴 하지만, 망망대해를 헤매는 분들에게 조금이나마 도움이 되길 바라며 글을 마칩니다.

내 아바타
님에게 답글

댓글을 불러오는 중...

개발 카테고리 관련 글

위 글이 유용하셨다면, 아래 글도 읽어보세요!