はじめに
最近、会社でGitHubを使ってコードを管理するようになった。管理しているコードはLambdaにデプロイしているものがほとんど。現状の開発の流れとしては「ローカルで作成・テスト」⇒「GitHubにコミット」⇒「コードをコピペしてコンソールからLambdaを作成」となっており、このコピペの作業が煩わしかった。GitHubから直接コードをデプロイする方法があると聞き、まずはGitHub Actionsから調べてみた。
GitHub Actionsとは
GitHub Actionsはビルドやテスト、パッケージング、デプロイなどを行うワークフローを作成し、それを実行するGitHubのサービス。ワークフローはリポジトリごとに設定でき、プッシュやプルリクエスト、Issue作成などのイベントをトリガーに実行される。GitHub ActionsはGitHubが用意している実行環境、もしくは自分たちが用意した実行環境上で実行できる。GitHub上の実行環境ではデフォルトはLinux(ubuntu)で用意されているが、自分たちの開発しているアプリによって他のOS(MAC、Windows)も指定することができる。
GitHubからLambdaをデプロイする
AWS側の設定
GitHubからAWS上のLambdaにデプロイするためには、GitHubが接続できるようにIAMロールの準備などが必要。まずはGitHub ActionsがAWSにアクセスする際に発行するOIDCトークンを受け取れるように設定する。
-
IAMにアクセスしIDプロバイダーからプロバイダーを追加を選択し、プロバイダのタイプとして「OpenID Connect」を選択する。そして、プロバイダーのURLとして「https://token.actions.githubusercontent.com
」を入力し、対象者として「sts.amazonaws.com
」を入力する。

プロバイダーのURLはOIDCトークンを受け取るためのエンドポイントで、対象者にはそのトークンを何に使うかを示している。これを設定情報を使ってAWS側でGitHubからのトークンを検証している。 -
GitHub Actions用のIAMロールを作成する。アイデンティティプロバイダーに先ほど作成したGitHub用のプロバイダーを選択し、Audienceとしてstsを選択。GitHub orginizationには使う予定のリポジトリのオーナーとしてユーザー名もしくはOrganizations名、そして必要であればリポジトリ名を入れる。

-
先ほど作成したIAMロールにポリシーを設定する。デプロイに必要な
UpdateFunctionCode、UpdateFunctionConfiguration、GetFunctionを付与している。ResourceにはデプロイするLambdaを指定する。今回作成したポリシーは以下の通り。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:UpdateFunctionCode",
"lambda:UpdateFunctionConfiguration",
"lambda:GetFunctionConfiguration"
],
"Resource": [
"arn:aws:lambda:ap-northeast-1:<ACCOUNT_ID>:function:test-lambda-1",
"arn:aws:lambda:ap-northeast-1:<ACCOUNT_ID>:function:test-lambda-2"
]
}
]
}
GitHub側の設定
GitHub Actions用のワークフローを作成する。ワークフローはYAMLで作成する。
name: test-lambda-deploy
on: [push]
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::<ACCOUNT_ID>:role/<ROLE_NAME>
aws-region: ap-northeast-1
- name: Deploy Lambda Function 1
uses: aws-actions/aws-lambda-deploy@v1
with:
function-name: test-lambda-1
code-artifacts-dir: ./lambdas/test-lambda-1
- name: Deploy Lambda Function 2
uses: aws-actions/aws-lambda-deploy@v1
with:
function-name: test-lambda-2
code-artifacts-dir: ./lambdas/test-lambda-2
| 設定項目 | 内容 |
|---|---|
| name | ワークフロー全体の名前。 |
| on | ワークフローの起動タイミング。PR作成や定期実行などもある。 |
| jobs | ワークフローの中で動かすジョブ。 |
| ┗ deploy | 1つのジョブのまとまり。 |
| ┗ runs-on | ジョブを実行する際のOS、Linux, MAC, Windowsが指定可能。 |
| ┗ permissions | ワークフローが使うGitHubトークンの権限設定。 |
| ┗ id-token | OIDCトークンを発行する許可を与える。none, read, writeが指定でき、発行するにはwrite。 |
| ┗ contents | リポジトリのコンテンツへのアクセス設定。none, read, writeが指定でき、リポジトリを読むだけならread。 |
| ┗ steps | ジョブの中で実行する処理のリスト。 |
| ┗ name | ステップの表示名。ログなどに出る。省略可能。 |
| ┗ uses | 既存のアクションを呼び出す。 |
| ┗ with | アクションに渡す入力パラメーター。 |
今回のワークフローの流れとしては、まず現在のリポジトリをランナー上にコピーする(actions/checkout@v4)。次にAWSにアクセスするための認証情報を取得している。ここでOIDCトークンを使ってAWSに用意したIAMロールのAssumeRoleを実施している(aws-actions/configure-aws-credentials@v4)。そして、取得した認証情報を使ってランナー上にコピーしたコードをLambdaにデプロイしている(aws-actions/aws-lambda-deploy@v1)。
実行結果
GitHub上でどのようにデプロイが進んでいるか確認することができる。
AWSコンソールから該当するLambdaのコードを確認するとPushしたコードが反映されていた。
また、権限が足りていない場合など何かエラーが発生した場合もここに表示される。以下はIAMロールにGetFunctionConfigurationが足りていなかった場合のエラー。
まとめ
GitHub ActionsからLambdaをデプロイする方法を確認した。もちろんLambda以外にもAWS CDKで作成したコードからリソースをデプロイすることもできる。

