AWSからLambda関数デプロイ用のGitHub Actionがリリースされました

AWSからLambda関数デプロイ用のGitHub Actionがリリースされました

2025.08.13

初めに

先週のリリースですがAWS Lambdaデプロイ用のアクションがAWS公式のOrgであるaws-actionsより提供されました。

https://aws.amazon.com/about-aws/whats-new/2025/08/aws-lambda-github-actions-function-deployment/
https://github.com/aws-actions/aws-lambda-deploy/tree/main

これまでLambda関数をGitHub ActionsでデプロイするためにはAWS CLI等を利用して自前で処理を組み込む必要がありました(もしくはサードパーティーのデプロイ用のアクションを組み込む)。

Lambda関数のデプロイの簡素化という意味ではAWS SAM CLIを利用することも選択肢ですがこちらの場合関数自体の設定にSAMテンプレートを利用するのでその周辺の知識が必要であり、またアプリ開発者にその辺りの設定を見せたくない場合は違う場所に配置して取得するなど一手間必要となります。

https://github.com/aws/aws-sam-cli

今回提供されるアクションでは、最低限の情報のみ設定することで開発者にはLambda関数自体の情報を隠蔽しつつデプロイ処理を提供することが可能です。
また任意パラメータを指定することで特定のパラメータだけを更新させることが可能なため、ここまではアプリ側で管理させたいといった場合でも柔軟に対応可能なのが魅力の一つです。

最大限広げれば関数の作成自体も可能かつSAMほど事前知識を必要としないのでちょっと作りたいという場合はこちらで全部管理することも可能です。

実装

サンプルコードを以下に設置しています。アプリコードはSAMで初期生成したものがあったのでそれをそのまま流用しています。

https://github.com/cm-suzuki-junya/sample-deploy-lambda-action

├── .github
│   └── workflows
│       └── deploy.yml
├── hello_world
│   ├── __init__.py
│   ├── app.py
│   └── requirements.txt
├── README.md
└── templates
    └── iam.yml ## GitHub Actions、Lambda関数用のIAMロール生成用のCloudFormationテンプレート

アプリのコードとデプロイ用のワークフロー以外にLambda関数を実行するためのロール、GitHub Actionsが利用するロールは必要になります。

今回はサンプルのため同じリポジトリに置いてますがアプリ開発者に見せたくない場合は別のリポジトリに設置しロールのARNはSecretsで引き渡す等して上手く分離しましょう。

ワークフローファイル抜粋

今回話の中核となる上記リポジトリのデプロイ用のワークフローファイルを抜粋します。

現時点(v1.0.1)ではaws-actions/aws-lambda-deployは指定したファイルをそのままデプロイするだけの機能となりますので、デプロイのために利用するロールへのスイッチロール処理(今回はaws-actions/configure-aws-credentials@v4を利用)やアプリ自体のビルド処理は別途書き込む必要はあります。

悪く言えばこの辺りは少し手間ですが、既存ビルド処理の使い回し、組織ポリシーに則った処理の組み込みといったことがやりやすく柔軟性は高いです。

deploy.yml
name: Deploy

on:
  workflow_dispatch: {}
permissions:
  id-token: write
  contents: read 
defaults:
  run:
    working-directory: "./hello_world"
env:
  PYTHON_VERSION: 3.13
  function-name: sample-actions-deploy-function
jobs:
  main:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Setup python
        uses: actions/setup-python@v5
        with:
          python-version: ${{ env.PYTHON_VERSION }}

      - name: Build
        run: pip install -r requirements.txt

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.deploy-role }}
          aws-region: ap-northeast-1

      - name: Deploy
        uses: aws-actions/aws-lambda-deploy@v1.0.1
        with:
          function-name: ${{ env.function-name }}
          ## working-directoryからの相対ではなくリポジトリ直下基準で判定していたので明示的に指定
          code-artifacts-dir: ./hello_world
          handler: app.lambda_handler
          runtime: python${{ env.PYTHON_VERSION }}
          role: ${{ secrets.LAMBDA_ROLE_ARN }}

aws-actions/aws-lambda-deployで必須指定となっているのは対象の関数名(function-name)、デプロイするファイル群のルートディレクトリとなる場所(code-artifacts-dir)、呼び出し時に実行されるハンドラ名(handler)、関数のランタイム(runtime)のみです。

今回は準備を楽にするためにLambda関数で利用するロール(role)の指定をつけていますが、このアクション処理で関数を生成したい場合のみ必須でそれ以外は任意です。
(指定がない場合かつ実行時に関数が存在しない場合Not Found扱いで失敗する)

Function configuration will be updated using the UpdateFunctionConfiguration API if configuration values differ from the deployed Lambda function's configuration.

As a first step, GetFunctionConfiguration is called to perform a diff between the provided configuration parameters and the configuration of the currently deployed function. If there is no change, UpdateFunctionConfiguration will not be called.

Lambda関数の設定側の更新は、withで指定したパラメータと実関数で差分があるものだけ更新することとなっておりますのでアプリ側で管理して欲しいものはここに記載してしまい、触れられたくないものは記載しないという形を取ればOKです。

IAMロール側でパラメータ単位の更新OK/NGは制御できませんので、マージ前の管理者レビューだけで不十分で厳密に不要なパラメータが追加されないようにチェックするにはマージ前にチェック用の処理を組み込むといった別の対応が必要になります。

withで指定可能なパラメーターには指定可能な各種Lambda関数の設定値以外にも、直接のZipアップロード形式ではなくS3経由でのアップロード方式を可能にするパラメーター等がありますので詳細は以下を参照してください。

https://github.com/aws-actions/aws-lambda-deploy/tree/main

実行

実行自体はワークフローを実行するだけなので特別何かはないのですが、aws-actions/aws-lambda-deployのログは以下の通りとなりました。

S3のパスを指定しない場合は内部処理的には作業ディレクトリにファイルをコピーしてからZIPに圧縮してアップロードするようです。

Run aws-actions/aws-lambda-deploy@v1.0.1

Setting custom user agent: LambdaGitHubAction/1.0.0
Checking if sample-actions-deploy-function exists
Packaging code artifacts from ./hello_world
Copying artifacts from /home/runner/work/sample-deploy-lambda-action/sample-deploy-lambda-action/hello_world to /tmp/lambda-temp-1755073961919
Found 3 files/directories to copy
Copying /home/runner/work/sample-deploy-lambda-action/sample-deploy-lambda-action/hello_world/__init__.py to /tmp/lambda-temp-1755073961919/__init__.py
Copying /home/runner/work/sample-deploy-lambda-action/sample-deploy-lambda-action/hello_world/app.py to /tmp/lambda-temp-1755073961919/app.py
Copying /home/runner/work/sample-deploy-lambda-action/sample-deploy-lambda-action/hello_world/requirements.txt to /tmp/lambda-temp-1755073961919/requirements.txt
Creating ZIP file with standard options
Adding file: __init__.py
Adding file: app.py
Adding file: requirements.txt
Writing ZIP file with standard options
Generated ZIP file size: 712 bytes
ZIP verification passed - contains 3 entries:
  1. __init__.py (0 bytes)
  2. app.py (886 bytes)
  3. requirements.txt (8 bytes)
Getting current configuration for function sample-actions-deploy-function
Updating function configuration for sample-actions-deploy-function
Waiting for function update to complete. Will wait for 5 minutes
Function update completed successfully
Updating function code for sample-actions-deploy-function with /tmp/lambda-function-1755073961919.zip
Original buffer length: 712 bytes
Lambda function deployment completed successfully

今回のサンプルくらいのプロジェクトであれば問題になりませんが、例えば細かいファイルが多量にできがちなnodejsでは「一度コピーして」のあたりで時間がかかる可能性があります。

もしこのあたりが気になるようであればデプロイ前に自前でZip処理+S3アップロードを実装してしまうのが良いかもしれません。

終わりに

今回は新しくAWS公式から提供されたLambda関数デプロイ用のアクションを利用してみました。

個人的に検証で書いたり趣味システムくらいであればインフラをセットで管理できるSAMの方が色々よしなにやってくれるのもあり使い勝手が良いなぁという感触ではあります。

コードだけの更新(+一部の設定の変更だけ)にフォーカスされていますので、どちらかといえば規模が大きくなったインフラ・アプリの管理境界の話が出てきた場合にうまくここを分離したい、組織ポリシーに沿うために色々独自処理を書き込みたいといったような柔軟性を求められる場合に活躍するものかなと考えています。

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.