概要
- 基礎を終えて、独自に構築したらめちゃ大変だったのでまとめる。
- 主に理解が浅いsam側の性であれこれ大変だった認識。
完成したワークフロー定義
まずは、動作する完成版のGitHub Actionsワークフロー定義を見てみる:
name: Deploy-AWS-SAM-Application
on:
push:
branches:
- 'deploy'
env:
SAM_CLI_TELEMETRY: 0
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-22.04
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
with:
python-version: '3.11'
- uses: aws-actions/setup-sam@v2
with:
use-installer: true
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::XXXXXXXXXX:role/XXXXXXXXXXXXXXXXXXXX
aws-region: ap-northeast-1
role-session-name: SamDeploy
- name: Build and Deploy SAM Application
working-directory: ./sam-deploy
run: |
# 最初のビルドとデプロイ
sam build --template-file template.yaml
sam deploy --no-confirm-changeset --no-fail-on-empty-changeset
# 2回目のビルド前に既存のファイルをリネーム
mv samconfig.toml samconfig.toml.bak
mv template.yaml template.yaml.bak
mv .aws-sam/build/template.yaml .aws-sam/build/template.yaml.bak
# Edge用のビルドとデプロイ
sam build --template-file XXXXXXXXXXX.yaml
sam deploy --stack-name XXXXXXXXXXX --region us-east-1 --capabilities CAPABILITY_IAM --resolve-s3
このワークフローは、deploy
ブランチにプッシュされたときに実行され、SAMアプリケーションを自動的にAWSにデプロイする
苦労ポイント1: 作業ディレクトリの指定
最初の課題は、SAM設定ファイルが特定のサブディレクトリに配置されている場合の作業ディレクトリの指定だった。
問題点
最初は単純にcd ./sam-deploy
コマンドで移動しようとしたが、うまく機能しなかった。
解決策
GitHub Actionsにはworking-directory
というパラメータがあり、これを使用することで簡単に作業ディレクトリを指定できる:
- name: Build and Deploy SAM Application
working-directory: ./sam-deploy
run: |
# コマンド...
これにより、すべてのコマンドが./sam-deploy
ディレクトリから実行されるようにる。相対パスの基準点はリポジトリのルートからの相対パスとなる。
苦労ポイント2: 複数のSAMテンプレートを連続でビルド・デプロイする
より難しかった課題は、同じジョブ内で複数のSAMテンプレートをビルドしてデプロイする際の問題だった。
問題点
2回目のsam build
実行時に、前回のビルド設定やファイルが残ってしまった。特にsamconfig.toml
の設定が引き継がれてしまい、使用していないはずのECRの設定エラーが発生した。
解決策
この問題を解決するために、2回目のビルド前に以前のビルド関連ファイルをリネームする方法を採用した:
# 2回目のビルド前に既存のファイルをリネーム
mv samconfig.toml samconfig.toml.bak
mv template.yaml template.yaml.bak
mv .aws-sam/build/template.yaml .aws-sam/build/template.yaml.bak
これにより、2回目のビルドが1回目のビルド設定の影響を受けることなく、クリーンな状態で実行できるようになった。
特別な要件: リージョンをまたいだデプロイ
この例では、通常のSAMアプリケーションを東京リージョン(ap-northeast-1)にデプロイした後、CloudFront + Lambda@Edge用のリソースをバージニアリージョン(us-east-1)にデプロイしている。
これは、Lambda@EdgeがCloudFrontと連携して動作するため、us-east-1リージョンにデプロイする必要があるため、2回目のデプロイでは、明示的にリージョンと追加のパラメータを指定している:
sam deploy --stack-name XXXXXXXXXXX --region us-east-1 --capabilities CAPABILITY_IAM --resolve-s3
まとめ
AWS SAMアプリケーションをGitHub Actionsで自動デプロイする際には、いくつかの注意点がある:
- 作業ディレクトリは
working-directory
パラメータで指定する - 複数のテンプレートをビルド・デプロイする場合は、前回のビルド設定が影響しないように注意する
- リージョンをまたいだデプロイが必要な場合は、適切なパラメータを指定する
後はSAMの仕様をきちんと理解することが大事、、