logo

AWS Lambda + JavaScriptをGitHub Actionsでデプロイする方法

AWS Lambda + JavaScriptをGitHub Actionsでデプロイする方法

投稿日:2025.12.21

更新日:2025.12.23

はじめに

JavaScriptで作ったLambda関数をGitHub Actionsでデプロイする方法について紹介します。
加えて、node_modulesのパッケージも含めてデプロイします。

サンプルコード

mizuyi/practice-build-aws-lambda | GitHub

github.com

ディレクトリ構成

.
├── .github/
│   └── workflows/
│       └── deploy.yml
└── src/
    ├── index.js
    ├── package.json
    └── package-lock.json

実装

deploy.yml

deploy.yml
name: "Deploy AWS Lambda"

on:
  workflow_dispatch:

permissions:
  id-token: write
  contents: read

env:
  AWS_DEPLOY_ROLE_ARN: ${{ secrets.AWS_DEPLOY_ROLE_ARN }}
  AWS_LAMBDA_ROLE_ARN: ${{ secrets.AWS_LAMBDA_ROLE_ARN }}
  AWS_REGION: ap-northeast-1
  LAMBDA_FUNCTION_NAME: lambda-function

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '24'

      - name: Install dependencies
        run: npm install
        working-directory: src

      - name: Login
        uses: aws-actions/configure-aws-credentials@v5
        with:
          role-to-assume: ${{ env.AWS_DEPLOY_ROLE_ARN }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Deploy to Lambda
        uses: aws-actions/aws-lambda-deploy@v1
        with:
          function-name: ${{ env.LAMBDA_FUNCTION_NAME }}
          code-artifacts-dir: src
          runtime: nodejs24.x
          handler: index.handler
          role: ${{ env.AWS_LAMBDA_ROLE_ARN }}

ROLE_ARNについて

  • AWS_DEPLOY_ROLE_ARN: OIDCプロバイダ + Lambdaの作成ポリシー
  • AWS_LAMBDA_ROLE_ARN: Lambdaの実行ポリシー
AWS_DEPLOY_ROLE_ARN 作成
  1. IAMでGitHub Actions用のロール(OIDCプロバイダ)を作成
  2. 以下のインラインポリシーを追加
  • lambda:CreateFunction: Lambda関数の作成
  • lambda:UpdateFunctionCode: 関数コードの更新
  • lambda:UpdateFunctionConfiguration: 関数設定の更新
  • lambda:GetFunctionConfiguration: 関数設定の取得
  • lambda:PublishVersion: バージョンの公開
  • iam:PassRole: Lambda実行ロールの割り当て
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:UpdateFunctionCode",
                "lambda:PassCapacityProvider",
                "iam:PassRole",
                "lambda:UpdateFunctionConfiguration",
                "lambda:GetFunctionConfiguration",
                "lambda:PublishVersion"
            ],
            "Resource": "*"
        }
    ]
}
AWS_LAMBDA_ROLE_ARN 作成
  1. Lambda実行用のロールを作成
  2. マネージドポリシーAWSLambdaBasicExecutionRoleをアタッチ
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Principal": {
                "Service": [
                    "lambda.amazonaws.com"
                ]
            }
        }
    ]
}

JSの依存関係をインストール

Lambda関数で使用するnode_modulesをインストール

  • working-directory: src
    ./srcで依存関係をインストール
- name: Install dependencies
  run: npm install
  working-directory: src

インストール後

  .
  ├── .github/
  │   └── workflows/
  │       └── deploy.yml
  └── src/
      ├── index.js
      ├── package.json
      ├── package-lock.json
+     └── node_modules/

AWSにログイン

OIDCプロバイダでログイン
OIDCプロバイダのロールにはLambda関数を作成するためのポリシーが必要です。

- name: Login
  uses: aws-actions/configure-aws-credentials@v5
  with:
    role-to-assume: ${{ env.AWS_DEPLOY_ROLE_ARN }}
    aws-region: ${{ env.AWS_REGION }}

Lambda関数をデプロイ

srcディレクトリのソースをLambda関数としてデプロイ
aws-actions/aws-lambda-deployを使用することでzip化の処理の記載を省略できます。

aws-actions/aws-lambda-deploy@v1

  • function-name: Lambda関数の名前
  • code-artifacts-dir: デプロイするコードのディレクトリ
  • runtime: Lambda関数の実行環境
  • handler: 実行する関数のエントリーポイント(ファイル名.関数名)
  • role: Lambdaの実行ロールのarn
- name: Deploy to Lambda
  uses: aws-actions/aws-lambda-deploy@v1
  with:
    function-name: ${{ env.LAMBDA_FUNCTION_NAME }}
    code-artifacts-dir: src
    runtime: nodejs24.x
    handler: index.handler
    role: ${{ env.AWS_LAMBDA_ROLE_ARN }}
handlerについて

handlerには実行するLambda関数の ファイル名.関数名 を指定

例1
以下の場合はindex.handlerになります

index.js
// ファイル名: index.js
// 関数名: handler
export const handler = async (event) => ({ statusCode: 200 });

例2
以下の場合はapp.mainになります

app.js
// ファイル名: app.js
// 関数名: main
export const main = async (event) => ({ statusCode: 200 });

参考

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

dev.classmethod.jp

aws-actions/aws-lambda-deploy: Deploys a Lambda function.

github.com