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 も充実していてより簡単に実装できそうです。
昔苦しんでいたことが解消されており、すっかり技術革新めいてまいりましたね。
以上です。