見出し画像

GitHub Actions + AWS SAM 昔話

こんにちは、iwanaga です。
表題のソースコード垂れ流しシリーズ第 2 弾です。

ときは 2020 年 5 月。
GitHub Actions 日も浅く、aws-actions の情報も充実していなかった。
当時苦しみながら書き、今も現役で動いている GitHub Actions + AWS SAM のコード、ご査収ください。

name: Nippo API Deploy

on:
  push:
    branches:
      - master

env:
  PYTHONUTF8: '1'

jobs:
  api-interface-deploy:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: packages/nippo-api-interface

    steps:
      - uses: actions/checkout@v2

      - name: package install
        run: |
          yarn
          yarn bootstrap
        working-directory: ./

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1

      - name: Build
        run: yarn build

      - name: Sam Package
        run: |
          sam package --template-file template-lambda.yaml \
          --output-template-file package-lambda.yaml \
          --s3-bucket nippo-api-interface-sam

      - name: Sam Deploy
        run: |
          echo y | sam deploy --no-fail-on-empty-changeset \
          --template-file package-lambda.yaml \
          --stack-name nippo-interface-lambda \
          --parameter-overrides \
          CorsAllowOrigin=${{ secrets.ALLOW_ORIGIN }} AuthIssuer=${{ secrets.AUTH_ISSUER }} \
          AuthAudience=${{ secrets.AUTH_AUDIENCE }} CustomDomainName=${{ secrets.CUSTOM_DOMAIN }} \
          CustomDomainCertArn=${{ secrets.CERT_ARN }} CustomDomainHostedZoneId=${{ secrets.DOMAIN_HOSTED_ID }} \
          DynamoTableName=${{ secrets.NIPPO_TABLE }} \
          --capabilities CAPABILITY_IAM \
          --role-arn ${{secrets.SAM_EXECUTION_ROLE_ARN}}

  tasks-deploy:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: packages/nippo-scheduled-task

    steps:
      - uses: actions/checkout@v2

      - name: package install
        run: |
          yarn
          yarn bootstrap
        working-directory: ./

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1

      - name: Build
        run: yarn build

      - name: Sam Package
        run: |
          sam package --template-file template.yaml \
          --output-template-file package-lambda.yaml \
          --s3-bucket nippo-scheduled-task-sam

      - name: Sam Deploy
        run: |
          echo y | sam deploy --no-fail-on-empty-changeset \
          --stack-name nippo-scheduled-task \
          --template-file package-lambda.yaml \
          --parameter-overrides \
          NippoSnsTopicArn=${{ secrets.NIPPO_SNS_TOPIC }} \
          DynamoTableName=${{ secrets.NIPPO_TABLE }} \
          NotifyWeeklyReportSlackUrl=${{secrets.NOTIFY_WEEKLY_REPORT_SLACK_URL}} \
          --capabilities CAPABILITY_IAM \
          --role-arn ${{secrets.SAM_EXECUTION_ROLE_ARN}}

  slack-workflow-status:
    if: always()
    name: Post Workflow Status To Slack
    needs:
      - api-interface-deploy
      - tasks-deploy
    runs-on: ubuntu-latest
    steps:
      - name: Slack Workflow Notification
        uses: Gamesight/slack-workflow-status@v1.0.1
        with:
          repo_token: ${{secrets.PERSONAL_GITHUB_TOKEN}}
          slack_webhook_url: ${{secrets.CICD_NOTIFY_SLCK_WEBHOOK_URL}}
          channel: '#weekly_report_dev'

lerna でモノレポになっていて、日報管理システムのバックエンドである「nippo-api-interface」と日報管理システムのバッチプログラムである「nippo-scheduled-task」です。

それぞれのパッケージに対して、sam package と deploy を実行しています。
対象はプライベートなサービスであり、多少止まっても良い(良くない)ので、 sam deploy は auto-approve にしています。
本当は、何かしらチェックする仕組みが必要なんですけど、必要になったらやります…
(なるべくお金をかけたくなかったので、検証環境もありません)

secret な値は、全部 GitHub Actions の環境変数に入れています。
これも、自分しかいじらないリポジトリだから良いのですが、複数人で開発する場合は、暗号化してファイル管理とかしたほうが良さそうですね。

最近は、公式サンプルや actions も充実していてより簡単に実装できそうです。
昔苦しんでいたことが解消されており、すっかり技術革新めいてまいりましたね。

以上です。

この記事が気に入ったらサポートをしてみませんか?