GitHub Actions から SAM テンプレートをデプロイする

AWS Misc

最近、遅ればせながら GitHub Actions を勉強中です。GitHub 上で作れるパイプラインで、AWS でいうところの CodeBuild や CodePipeline と似たようなことができそうです(よく分かってない)。料金 は、パブリックリポジトリに対しては無料で、プライベートリポジトリでも 500 MB & 2,000 min/month までは無料のようです。無料でこんなことができてよいのでしょうか。

GitHub Actions の強みは、GitHub と統合されているので手間がかからないことや、処理ブロックを Action として再利用できる点が挙げられるようです(参考)。AWS の各サービスと連携するための Action も 公開 されています。

この記事は、その動作確認をした際の作業ログの第 2 弾です。第 1 弾はこちら。

また、今回の動作確認は このブログ記事 を参考にしています。

GitHub リポジトリの準備

リポジトリの作成

とりあえず適当なプライベートリポジトリをぽちぽち作成します。名前は test-sam とします。

シークレットの設定

ワークフロー内から AWS 環境を操作するので、あらかじめ GitHub 側に認証情報をセットしておく必要があります。今回は、リポジトリにシークレットを作成する ことで対応します。

必要なシークレットは以下の 2 つです

  • AWS_ACCESS_KEY_ID : 必要な権限を持つ IAM ユーザーのアクセスキー ID
  • AWS_SECRET_ACCESS_KEY : 必要な権限を持つ IAM ユーザーのシークレットアクセスキー

SAM プロジェクトの準備

SAM プロジェクトの作成

ひとまず SAM CLI の sam init コマンドを使用して、ローカル環境に SAM プロジェクトを作成します。

$ sam init -n test-sam -r python3.8 --app-template "hello-world" --package-type Zip

忘れないうちに GitHub のリポジトリと関連付けておきます。

$ cd test-sam
$ git init
$ git remote add origin https://github.com/<user-id>/test-sam.git

サンプルコード書き換え

(オプション)動作イメージがつかみやすいように、サンプルコードに少しだけ手を加えます。

このサンプルコード(”hello-world” テンプレート)は、API Gateway 経由で Lambda 関数を実行し、テキストを返すという、非常にシンプルなものです。このことは、test-sam プロジェクト内の template.yaml を見てみると分かります。

Lambda 関数の実体の Python コードは hello_world/ ディレクトリにあるので、その返り値のテキストを適当なものに変えておきます。

...
    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world! this is github-actions-sam test!",
            # "location": ip.text.replace("\n", "")
        }),
    }

ワークフローの追加

GitHub Actions で使用するワークフローの定義ファイルを追加します。ファイルの置き場所に注意です。

name: Deploy SAM Project

on: push

jobs:
  deploy-sam:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
      - uses: aws-actions/setup-sam@v1
      - 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: ap-northeast-1
      - run: sam build
      - run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset --stack-name test-sam-stack --resolve-s3 --capabilities CAPABILITY_IAM --region ap-northeast-1

ワークフロー構文は ドキュメント を読めば分かりますが、登場した部分についていうと、

on はワークフローを発火させるタイミングを指定します。今回は、リポジトリに push されたタイミングで発火するようにします。

jobs は処理のかたまり (job) の集合です。デフォルトでは、各 job は並列で実行されます。今回は、deploy-sam という job を 1 つだけ定義しています。

deploy-sam では、実行環境(ランナー)を runs-on で指定し、具体的な手順を steps で指定しています。各 step は、逐次実行されていきます。

最初の 1-2 ステップでは、予め公開されているアクションを使って、チェックアウトと Python のセットアップを行っています。具体的なコマンドを自分で記述しなくても処理を実行してくれるのが Action の強みですね。

次の 3-4 ステップは、AWS が公開しているアクションを使って、SAM のセットアップと認証情報のセットを行っています。認証情報は、先ほど GitHub リポジトリにセットしたシークレットを参照するようにしています。これで、このランナー上で SAM CLI を使えるようになりました。

最後の 5-6 ステップは、SAM CLI を使って今回のサンプルプロジェクトのビルドとデプロイを実施しています。これで、ローカル環境の Python コードがパッケージ化された CloudFormation テンプレートが作成されて、AWS 環境上にデプロイされるはずです。

動作確認

プロジェクト内の全ファイルを commit して push します。

$ git add .
$ git commit -m "first commit"
$ git push -u origin master

すると、先ほどのワークフローが自動で実行され(on: push)…、

ステップ “Run sam deploy…” の実行ログを見てみると、作成された APIGW のエンドポイントが出力されているので、そこから Lambda 関数を実行させることができます。

補足:スタックの更新

アプリケーションコードを適当に書き換えて push し、応答が変わるか確認してみましょう。

おつかれさまでした。

タイトルとURLをコピーしました