aws-actions/aws-lambda-deployを使ってGitHub ActionsでLambdaをデプロイ
aws-actions/aws-lambda-deployを使ってGitHub ActionsでLambdaをデプロイ
概要
AWS公式のGitHub Actions「aws-actions/aws-lambda-deploy」が公開され、YAMLのみでLambdaをデプロイできるようになりました。
AWS CLIやCloudFormation(CFn)を使わず、シンプルなワークフローでLambdaのデプロイが可能です。
前提
- aws-actions/aws-lambda-deployのバージョン : v1
- OIDC認証用IAMの設定は本記事では扱いません
ファイル構成
tree -Fa -I '.git|.devcontainer|LICENSE|README.md|.gitignore'
.
├── .github/
│ └── workflows/
│ └── lambda-deploy.yml
└── src/
└── lambda/
└── lambda_function.py
4 directories, 2 files
ファイルの用途
- lambda-deploy.yml
GitHub Actionsのワークフローファイル。
aws-actions/aws-lambda-deploy
を使ってLambdaをデプロイします。 - lambda_function.py
デプロイ対象のLambda関数。
作成したワークフロー
ワークフロー全体
全体のYAMLは以下です。
この後、各部分について解説します。
lambda-deploy.yml全体
---
name: Deploy Lambda Function
run-name: Deploy Lambda Function on ${{ github.ref_name }}
on: # yamllint disable-line rule:truthy
push:
branches:
- main
paths:
- "src/lambda/*"
workflow_dispatch:
defaults:
run:
shell: bash
permissions:
contents: read
id-token: write
env:
LAMBDA_EXECUTION_ROLE: ${{ secrets.LAMBDA_EXECUTION_ROLE }}
ROLE_TO_ASSUME: ${{ secrets.ROLE_TO_ASSUME }}
jobs:
deploy-lambda:
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
# v4.2.2
with:
persist-credentials: "false"
- name: Configure AWS credentials
# yamllint disable-line rule:line-length
uses: aws-actions/configure-aws-credentials@7474bc4690e29a8392af63c5b98e7449536d5c3a # v4.3.1
with:
aws-region: ap-northeast-1
mask-aws-account-id: true
role-to-assume: "${{ env.ROLE_TO_ASSUME }}"
- name: Deploy Lambda Function
# yamllint disable-line rule:line-length
uses: aws-actions/aws-lambda-deploy@adf3041f6b285d61334ae702e0b6e8e1080f9eb0 # v1
with:
architectures: arm64
code-artifacts-dir: src/lambda
function-name: lambda_function
handler: lambda_function.lambda_handler
role: "${{ env.LAMBDA_EXECUTION_ROLE }}"
runtime: python3.13
ワークフローのトリガー
pushとworkflow_dispatchをトリガーとして、以下の場合にワークフローが動くようにしています。
- mainブランチのsrc/lambda配下のファイル更新時
- 手動実行時
on: # yamllint disable-line rule:truthy
push:
branches:
- main
paths:
- "src/lambda/*"
workflow_dispatch:
パーミッション
リポジトリをチェックアウトするために contents: read
を設定します。
OIDCで認証するために id-token: write
を設定します。
permissions:
contents: read
id-token: write
環境変数
GitHubのシークレットからIAMロールのARNを環境変数に設定します。
- LAMBDA_EXECUTION_ROLE : Lambda実行用IAMロール
- ROLE_TO_ASSUME : GitHub Actions用IAMロール
env:
LAMBDA_EXECUTION_ROLE: ${{ secrets.LAMBDA_EXECUTION_ROLE }}
ROLE_TO_ASSUME: ${{ secrets.ROLE_TO_ASSUME }}
Lambdaのデプロイ部分
aws-actions/aws-lambda-deploy
を使い、数行のYAMLでLambdaをデプロイできます。
code-artifacts-dir
に指定したディレクトリ配下が自動でzip化されるため、事前のzip化は不要です。
パラメータ | 設定値 | 備考 |
---|---|---|
architectures | arm64 | |
code-artifacts-dir | src/lambda | lambda_function.pyの格納ディレクトリ |
function-name | lambda_function | |
handler | lambda_function.lambda_handler | Lambda ハンドラー関数が配置されているファイルの名前.Python ハンドラー関数の名前 |
role | "${{ env.LAMBDA_EXECUTION_ROLE }}" | Lambda実行用IAMロール |
runtime | python3.13 |
- name: Deploy Lambda Function
# yamllint disable-line rule:line-length
uses: aws-actions/aws-lambda-deploy@adf3041f6b285d61334ae702e0b6e8e1080f9eb0 # v1
with:
architectures: arm64
code-artifacts-dir: src/lambda
function-name: lambda_function
handler: lambda_function.lambda_handler
role: "${{ env.LAMBDA_EXECUTION_ROLE }}"
runtime: python3.13
ワークフローの実行・動作確認
ワークフローの実行
Lambda更新時のワークフローのログ例です。
24-29行目でzip化し、その後Lambdaが更新されています。
Lambdaの確認
AWSマネジメントコンソールでLambdaがデプロイされていることを確認できます。
気になるところ
aws-actions/aws-lambda-deploy
を使うことで数行のYAMLでLambdaをデプロイできました。
AWS CLIを介さずにデプロイできるので、アプリ開発チームが自分たちでLambdaをデプロイするハードルが下がったように感じます。
一方で、 aws-actions/aws-lambda-deploy
には、Lambdaの削除機能は無さそうです。
アプリ開発チームが不要になったLambdaを削除するには、AWSマネコンから削除したり、AWS CLIを介しての削除が必要そうです。
不要になったリソースを綺麗に削除してくれるという点では、CFnだとLambdaを定義しているリソース名を削除すればよいので、CFnの方が便利に感じます。
参考
Discussion