のべラボ.blog

Tech Blog | AWS や サーバーレスやコンテナ などなど

今さらながら GitHub Actions をさわってみる: (AWS SAM のデプロイ編)

前回の記事では、GitHub Actions のワークフローから AWS アカウントへのアクセス方法を確認しました。

その方法を用いて、今回は AWS アカウントへサーバーレスアプリケーションのビルドとデプロイを行ってみます。

アプリケーションは、Amazon API GatewayAWS Lambda を使用して HelloWorld メッセージを返すだけのシンプルなものです。

このようなシンプルなものであれば、AWS SAM ( Serverless Application Model ) の事前定義済のアプリケーションテンプレートを用いるとすぐに作成することができます。

この AWS SAM を使用してデプロイを行うワークフローを作成し、実際にデプロイするまでの手順を記載していきます。

なお、この記事の内容は 2023 年 3月時点で検証した内容に基づいています。また記事の中の AWS アカウント IDはすべて 0 で表記しています。


手順の概要

  1. GitHubリポジトリを作成する
  2. デプロイ先の AWS アカウントの IAM で ID プロバイダの設定と IAM ロールの作成を行う
  3. GitHubリポジトリで IAM ロールの ARN の値を Secret として保存する
  4. AWS SAM のリソースを作成する
  5. GitHub Actions のワークフローの YAML ファイルを作成する
  6. リポジトリに push してワークフローの実行結果を確認する

1. GitHubリポジトリを作成する

任意の名前でリポジトリを作成します。

この名前は、次の IAM ロール作成時に必要になります。


2. デプロイ先の AWS アカウントの IAM で ID プロバイダの設定と IAM ロールの作成を行う

ID プロバイダの設定については前回の記事(下記)で説明している手順通りです。一回、設定していれば改めて設定する必要はありません。

nobelabo.hatenablog.com

IAM ロールの作成では、今回は ワークフローから AWS SAM CLI のコマンドを実行してデプロイを行いますので、そのために必要なポリシーを設定した IAM ロールを作成します。

これも前回の記事の内容を参考に行えます。

ただし、許可ポリシーは下記のように AWS SAM によるデプロイを許可する内容にします。

許可ポリシーの例は、以前に紹介した記事(下記)にありますので、これを利用します。

nobelabo.hatenablog.com

また、信頼ポリシーは使用するリポジトリに合わせて下記のように設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::000000000000:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
                },
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": "repo:<GitHubユーザーID>/<GitHubリポジトリ名>:*"
                }
            }
        }
    ]
}

IAM ロールを作成したら、ARN の値をメモしておきます。これは次の手順で使用します。


3. GitHubリポジトリで IAM ロールの ARN の値を Secret として保存する

前の手順でメモしておいた IAM ロールの値を、GitHub リポジトリの Secretとして保存します。

この手順も前回の記事を参考に行えます。


4. AWS SAM のリソースを作成する

AWS SAM CLI をインストールしている環境で、初期化を行います。

利用する AWS SAM CLI のバージョンは、 1.76.0 以降を前提としています。

sam --version
SAM CLI, version 1.76.0

今回は、Python 3.8 をラインタイムとして指定します。X-Ray トレースや Amazon CloudWatch Application Insights のモニタリング を無効化する前提です。

--name は、任意の名前を設定します。

sam init --runtime python3.8 \
              --app-template hello-world  \
              --name actions-aws-sam     \
              --no-tracing                      \
              --no-application-insights

--name で指定したフォルダが作成されるので、そこに移動し、git initgit remote add を実行します。

cd actions-aws-sam
git init
git remote add origin https://github.com/<GitHubユーザーID>/<GitHubリポジトリ名.git

この段階で、AWS SAM CLI により HelloWorld メッセージを出力する PythonAWS Lambda 関数と、それと統合した Amazon API GatewayAPI のリソースは揃っています。

ただ 今回は、GitHub Actions のワークフローからデプロイする際に必要な AWS SAM の細かいパラメータは、ファイルに保存しておくようにしたいと思います。

そのため、--name で指定したフォルダ に、samconfig.toml というファイルを作成し、下記の内容を指定して保存します。

version=0.1
[default.deploy.parameters]
stack_name = "<任意のスタック名>"
s3_bucket = "<AWS SAM のリソースをアップロードする S3バケット名>"
s3_prefix = "<上記 S3 バケットのフォルダ名>"
confirm_changeset = false
capabilities = "CAPABILITY_IAM"

s3_bucket で指定するバケットはあらかじめ作成しておきましょう。s3_prefix で指定した名前は S3 バケットのフォルダになり、任意の名前を設定できますがあらかじめフォルダを作成しておく必要はありません。

これで AWS SAM のリソースの準備は完了です。


5. GitHub Actions のワークフローの YAML ファイルを作成する

では、AWS SAM リソースをデプロイするワークフローの YAML を 作成します。

--name で指定したフォルダ の下に .github/workflows フォルダ作成して、そこに 任意の名前の YAML ファイルを作成します。

内容については、下記のドキュメントにサンプルがあるので、これを活用します。

docs.aws.amazon.com

ただし、このサンプルでは OIDC を使用せず Secret に AWS アカウントの認証情報を指定していますので、この部分は OIDC を使うように変更します。

また、--no-confirm-changeset オプションは すでに samconfig.toml 内で指定しているので、このオプションの指定も削除します。

on:
  push:
    branches:
      - main
env:
  AWS_REGION : "ap-northeast-1"
# permission can be added at job level or workflow level    
permissions:
      id-token: write   # This is required for requesting the JWT
      contents: read    # This is required for actions/checkout
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v3
      - uses: aws-actions/setup-sam@v2
      - uses: aws-actions/configure-aws-credentials@v1
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
          role-session-name: samplerolesession
          aws-region: ${{ env.AWS_REGION }}
      - run: sam build --use-container
      - run: sam deploy --no-fail-on-empty-changeset

ポイントは 17 行目の - uses: aws-actions/setup-sam@v2 ですね。 AWS SAM を使用するためのアクションがあるので、それを使用することで ワークフローから AWS SAM CLI を実行できます。

これでワークフローの準備も完了しました。


6. リポジトリに push してワークフローの実行結果を確認する

では、いよいよ リポジトリに push してワークフローを実行します。

git add.
git commit -m "commit sam resource"
git push -u origin main

無事に ワークフローが完了していれば、下図の赤枠の Run sam deploy のステップを展開表示してみましょう

AWS SAM による deploy の結果として、Outputs セクションが表示されています。

CloudFormation outputs from deployed stack
----------------------------------------------------------------------------------
Outputs                                                                                         
----------------------------------------------------------------------------------
Key                 HelloWorldFunctionIamRole                                                   
Description         Implicit IAM Role created for Hello World function                          
Value               arn:aws:iam::***:role/actions-aws-sam-stack-                       
HelloWorldFunctionRole-WCPOUUNE5S2W                                                             

Key                 HelloWorldApi                                                               
Description         API Gateway endpoint URL for Prod stage for Hello World function            
Value               https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/     

その中の KeyHelloWorldApiValue のURL の値をコピーして Web ブラウザでアクセスします。

結果、下記のようなメッセージが表示されればアプリケーションが正常にデプロイされています。

{"message": "hello world"}

今回の所感

今回で GitHub Actions のワークフローを使用し、AWS SAM によるアプリケーションのデプロイができました。

知識ゼロのところから、下記の記事を書き連ね、コツコツと学んで積み上げてきた知識を組み合わせて実現できたと感じています。

nobelabo.hatenablog.com

nobelabo.hatenablog.com

nobelabo.hatenablog.com

今回は GitHub Actions 側の視点から AWS SAM を使用する方法を確認しましたが、AWS SAM には、実は GitHub Actions のワークフローを自動生成する機能があります。

docs.aws.amazon.com

これも一応触ってみたので、また別の機会に記事で紹介したいと思います。


/* -----codeの行番号----- */