Step 6에서는 Azure Container Registry에 로그인하는 Username과 Password를 Key Vault Secret에 저장하고, GitHub Actions 워크플로에서 Key Vault Secret(비밀)을 사용하는 방법에 대해서 실습해봅니다.
- 전체 워크플로우는 GitHub Actions 워크플로에서 Key Vault 비밀 사용으로 구성하여야 하나, 본 Step에서는 단순히 GitHub Actions에서 Key Vault를 사용하는 부분만을 학습하는 목적으로 Azure App Service에 컨테이너를 배포하는 부분은 스킵하고, Container Registry에 로그인하는 step만 구성하도록 합니다.
-
서비스 주체 (Service Principal)을 정의합니다. Azure Portal의 Cloudshell을 열어서 아래의 Azure CLI를 실행하여 서비스 주체를 만듭니다. "{myApp}", "{subscription-id}", "{resourceGroups}"를 작업중인 Azure 구독과 앱 이름에 맞게 변경합니다.
az ad sp create-for-rbac --name {myApp} --role contributor --scopes /subscriptions/{subscription-id}/resourceGroups/{MyResourceGroup} --sdk-auth
-
#1을 실행하면 Azure CLI가 아래의 형태로 JSON 형식으로 서비스 주체를 반환합니다. 이를 복사하여 GitHub Secret에 등록합니다. "AZURE_CREDENTIALS"라는 이름으로 등록합니다.
{ "clientId": "", "clientSecret": "", "subscriptionId": "", "tenantId": "", (...) }
-
GitHub Actions의 Secret을 생성합니다. GitHub의 리포지토리로 이동하여 "Setting > Secrets and variables > Actions" 메뉴에서 "New repository secret" 메뉴를 선택하여 새로운 Secret을 생성합니다. Name 항목에 "AZURE_CREDENTIALS"을 입력하고, Secret 항목에 #2에서 복사한 JSON 형식의 서비스 주체를 붙여넣기 합니다.
-
Azure Portal에서 Azure Container Registry를 생성합니다.
-
생성된 Container Registry의 "Access keys" 메뉴에서 Username과 password를 복사하여 Key Vault의 Secret을 생성할 것입니다.
-
Azure Portal에서 Key Vault를 생성합니다.
-
생성한 Key Vault의 "비밀" 메뉴에서 containerUsername, containerPassword를 생성합니다. #4에서 복사한 Username과 password 값을 입력합니다.
-
Azure Portal의 Cloudshell을 열어서 역할 할당 (role assignment) 추가합니다. 키 자격 증명 모음에 액세스할 수 있도록 Azure 서비스 주체에 대한 get과 list 액세스 권한을 부여합니다. #6에서 생성한 Key Vault의 이름을 "keyVaultName"에 넣고, #1에서 출력한 서비스 주체의 clientId를 "clientIdGUID"에 넣습니다.
az keyvault set-policy -n {keyVaultName} --secret-permissions get list --spn {clientIdGUID}
-
GitHub Actions의 워크플로우에서 키 자격 증명 모음 비밀 (Key Vault Secret)을 참조하여 Azure Container Registry에 로그인 하는 job을 추가합니다.
먼저, 리파지토리의 "Actions" 메뉴에서 "New workflow"를 클릭하여 새로운 워크플로우를 생성합니다.
"set up a workflow yourself"를 선택하여 새로운 워크플로우 파일을 열어 아래의 워크플로우를 복사하여 붙여넣기 합니다. "keyvault"에 #5에서 생성한 Key Vault의 이름을 넣습니다.
name: Example key vault flow
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
# checkout the repo
- uses: actions/checkout@v2
- uses: Azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- uses: Azure/get-keyvault-secrets@v1
with:
keyvault: "containervault-webapp"
secrets: 'containerPassword, containerUsername'
id: myGetSecretAction
- uses: azure/docker-login@v1
with:
login-server: ${{ steps.myGetSecretAction.outputs.containerUsername }}.azurecr.io
username: ${{ steps.myGetSecretAction.outputs.containerUsername }}
password: ${{ steps.myGetSecretAction.outputs.containerPassword }}