연습 - 여러 환경에서 Bicep 매개 변수 사용

완료됨

워크플로가 두 환경 모두에 배포되어 제품 검토를 위해 타사 API와 통합할 수 있습니다.

웹 사이트 팀이 웹 사이트에서 서비스에 액세스하는 데 사용해야 하는 API 키와 URL을 제공했습니다. 테스트 및 프로덕션 환경에서 사용할 여러 값이 있습니다. 이 단원에서는 제품 검토 API에 대한 올바른 설정으로 각 환경을 구성하도록 워크플로를 업데이트합니다.

프로세스 중에 다음을 수행합니다.

  • 각 환경의 검토 API 키에 대한 비밀을 만듭니다.
  • 각 환경에 대한 올바른 입력 및 비밀 값으로 워크플로를 업데이트합니다.
  • Bicep 파일을 업데이트하여 제품 검토 API에 필요한 설정을 전파합니다.
  • 워크플로 결과와 Azure 환경의 변경 내용을 검토합니다.

비밀 추가

API 키가 적절하게 보호되도록 GitHub 비밀에 저장하기로 결정합니다.

  1. 브라우저에서 설정비밀과 변수작업으로 이동합니다.

    설정 범주 아래 비밀 메뉴 항목을 보여 주는 GitHub의 스크린샷.

  2. 새 리포지토리 비밀 단추를 선택합니다.

  3. 비밀 이름으로 REVIEW_API_KEY_TEST를 입력하고 값으로 sandboxsecretkey를 입력합니다.

    새 비밀을 보여 주는 GitHub의 스크린샷

  4. 비밀 추가를 선택합니다.

  5. 프로세스를 반복하여 비밀 이름으로 REVIEW_API_KEY_PRODUCTION이라는 또 다른 비밀을 추가하고 값으로 productionsecretkey를 추가합니다. 비밀 추가를 선택합니다.

새 설정을 사용하도록 deploy.yml 파일 업데이트

  1. Visual Studio Code에서 ‘deploy.yml’ 파일을 엽니다.

  2. inputssecrets 설정에 대한 새 값을 포함하도록 워크플로 트리거를 업데이트합니다.

    on:
      workflow_call:
        inputs:
          environmentType:
            required: true
            type: string
          resourceGroupName:
            required: true
            type: string
          reviewApiUrl:
            required: true
            type: string
        secrets:
          AZURE_CLIENT_ID:
            required: true
          AZURE_TENANT_ID:
            required: true
          AZURE_SUBSCRIPTION_ID:
            required: true
          reviewApiKey:
            required: true
    

    API URL은 비밀 값이 아니므로 입력으로 포함합니다.

  3. validate 작업에서 새 배포 매개 변수를 포함하도록 단계를 업데이트합니다.

    jobs:
      validate:
         runs-on: ubuntu-latest
         steps:
         - uses: actions/checkout@v3
         - uses: azure/login@v1
           name: Sign in to Azure
           with:
            client-id: ${{ secrets.AZURE_CLIENT_ID }}
            tenant-id: ${{ secrets.AZURE_TENANT_ID }}
            subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
         - if: inputs.environmentType != 'Production'
           uses: azure/arm-deploy@v1
           name: Run preflight validation
           with:
             deploymentName: ${{ github.run_number }}
             resourceGroupName: ${{ inputs.resourceGroupName }}
             template: ./deploy/main.bicep
             parameters: >
               environmentType=${{ inputs.environmentType }}
               reviewApiUrl=${{ inputs.reviewApiUrl }}
               reviewApiKey=${{ secrets.reviewApiKey }}
             deploymentMode: Validate
         - if: inputs.environmentType == 'Production'
           uses: azure/arm-deploy@v1
           name: Run what-if
           with:
             failOnStdErr: false
             resourceGroupName: ${{ inputs.resourceGroupName }}
             template: ./deploy/main.bicep
             parameters: >
               environmentType=${{ inputs.environmentType }}
               reviewApiUrl=${{ inputs.reviewApiUrl }}
               reviewApiKey=${{ secrets.reviewApiKey }}
             additionalArguments: --what-if
    
  4. 새 배포 매개 변수를 포함하도록 deploy 작업을 업데이트합니다.

    deploy:
      needs: validate
      environment: ${{ inputs.environmentType }}
      runs-on: ubuntu-latest
      outputs:
        appServiceAppHostName: ${{ steps.deploy.outputs.appServiceAppHostName }}
      steps:
      - uses: actions/checkout@v3
      - uses: azure/login@v1
        name: Sign in to Azure
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      - uses: azure/arm-deploy@v1
        id: deploy
        name: Deploy Bicep file
        with:
          failOnStdErr: false
          deploymentName: ${{ github.run_number }}
          resourceGroupName: ${{ inputs.resourceGroupName }}
          template: ./deploy/main.bicep
          parameters: >
            environmentType=${{ inputs.environmentType }}
            reviewApiUrl=${{ inputs.reviewApiUrl }}
            reviewApiKey=${{ secrets.reviewApiKey }}
    
  5. 파일의 변경 내용을 저장합니다.

새 설정을 제공하도록 workflow.yml 파일 업데이트

  1. Visual Studio Code에서 workflow.yml 파일을 엽니다.

  2. 각 환경에 대해 reviewApiUrl 입력과 reviewApiKey 비밀을 추가합니다.

    name: deploy-toy-website-environments
    concurrency: toy-company
    
    on:
      push:
        branches:
          - main
      workflow_dispatch:
    
    permissions:
      id-token: write
      contents: read
    
    jobs:
    
      # Lint the Bicep file.
      lint:
        uses: ./.github/workflows/lint.yml
    
      # Deploy to the test environment.
      deploy-test:
        uses: ./.github/workflows/deploy.yml
        needs: lint
        with:
          environmentType: Test
          resourceGroupName: ToyWebsiteTest
          reviewApiUrl: https://sandbox.contoso.com/reviews
        secrets:
          AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID_TEST }}
          AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
          AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
          reviewApiKey: ${{ secrets.REVIEW_API_KEY_TEST }}
    
      # Deploy to the production environment.
      deploy-production:
        uses: ./.github/workflows/deploy.yml
        needs: deploy-test
        with:
          environmentType: Production
          resourceGroupName: ToyWebsiteProduction
          reviewApiUrl: https://api.contoso.com/reviews
        secrets:
          AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID_PRODUCTION }}
          AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
          AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
          reviewApiKey: ${{ secrets.REVIEW_API_KEY_PRODUCTION }}
    
  3. 파일의 변경 내용을 저장합니다.

Bicep 파일 업데이트

  1. main.bicep 파일을 엽니다.

  2. 이미 파일에 있는 매개 변수 아래에 새 검토 API에 대한 다음 매개 변수를 추가합니다.

    @description('The URL to the product review API.')
    param reviewApiUrl string
    
    @secure()
    @description('The API key to use when accessing the product review API.')
    param reviewApiKey string
    
  3. 애플리케이션에 검토 API URL 및 키를 제공하도록 appServiceApp 리소스 정의를 업데이트하여 웹 사이트 코드에서 사용할 수 있도록 합니다.

    resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
      name: appServiceAppName
      location: location
      properties: {
        serverFarmId: appServicePlan.id
        httpsOnly: true
        siteConfig: {
          appSettings: [
            {
              name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
              value: applicationInsights.properties.InstrumentationKey
            }
            {
              name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
              value: applicationInsights.properties.ConnectionString
            }
            {
              name: 'ReviewApiUrl'
              value: reviewApiUrl
            }
            {
              name: 'ReviewApiKey'
              value: reviewApiKey
            }
          ]
        }
      }
    }
    
  4. 파일의 변경 내용을 저장합니다.

  5. 다음 명령을 사용하여 변경 사항을 커밋하고 Git 리포지토리에 푸시합니다.

    git add .
    git commit -m "Add new review API settings to Bicep file and workflow"
    git push
    

배포 결과 검토

  1. 브라우저에서 워크플로 실행으로 이동합니다.

  2. 가장 최근 실행을 선택합니다.

  3. 가장 최근에 실행한 워크플로를 선택합니다.

    deploy-production / deploy 작업 전에 워크플로가 일시 중지될 때까지 기다립니다. 워크플로가 이 지점에 도달하는 데는 몇 분 정도 걸릴 수 있습니다.

  4. 배포 검토를 선택한 다음, 프로덕션을 선택하고, 승인 및 배포를 선택하여 프로덕션 환경에 대한 배포를 승인합니다.

    워크플로의 실행이 완료될 때까지 기다립니다.

  5. 코드를 선택한 다음, 프로덕션 환경을 선택합니다.

    이제 환경 기록에 여러 배포가 표시됩니다.

  6. 브라우저에서 Azure Portal로 이동합니다.

  7. ToyWebsiteProduction 리소스 그룹으로 이동합니다.

  8. 리소스 목록에서 Azure App Service 앱을 엽니다.

    Configuration(구성) 을 선택합니다.

    App Service 앱 및 구성 메뉴 항목을 표시하는 Azure Portal 스크린샷

  9. 값 표시를 선택합니다.

    App Service 앱 설정 및 값을 표시하는 버튼을 보여주는 Azure Portal 스크린샷

  10. ReviewApiKeyReviewApiUrl 설정의 값은 프로덕션 환경에 대해 구성한 값으로 설정됩니다.

    App Service 앱 설정과 구성 설정을 보여주는 Azure Portal 스크린샷

  11. ToyWebsiteTest 리소스 그룹의 App Service 앱에 대한 구성 설정에 현재 값을 비교합니다. 값이 서로 다릅니다.

리소스 정리

이제 연습을 완료했으므로 리소스에 대한 요금이 청구되지 않도록 리소스를 제거할 수 있습니다.

Visual Studio Code 터미널에서 다음 명령을 실행합니다.

az group delete --resource-group ToyWebsiteTest --yes --no-wait
az group delete --resource-group ToyWebsiteProduction --yes --no-wait

리소스 그룹은 백그라운드에서 삭제됩니다.

Remove-AzResourceGroup -Name ToyWebsiteTest -Force
Remove-AzResourceGroup -Name ToyWebsiteProduction -Force