⚙️

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全体
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マネコンのLambdaの画面

気になるところ

aws-actions/aws-lambda-deploy を使うことで数行のYAMLでLambdaをデプロイできました。
AWS CLIを介さずにデプロイできるので、アプリ開発チームが自分たちでLambdaをデプロイするハードルが下がったように感じます。

一方で、 aws-actions/aws-lambda-deploy には、Lambdaの削除機能は無さそうです。
アプリ開発チームが不要になったLambdaを削除するには、AWSマネコンから削除したり、AWS CLIを介しての削除が必要そうです。
不要になったリソースを綺麗に削除してくれるという点では、CFnだとLambdaを定義しているリソース名を削除すればよいので、CFnの方が便利に感じます。

参考

https://github.com/aws-actions/aws-lambda-deploy
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-handler.html#python-handler-naming

Discussion