☁️

[2025年8月最新版] AWSにLambda関数を GitHub Actions から安全にデプロイする方法

に公開

概要

AWS Lambdaの関数を漏洩のリスクがあるアクセスキーの代わりに、OIDCを使用して安全にGitHub Actionsからデプロイする方法です。

前提条件

  • Lambda関数を既に作成済み
    • 今回使用したアーキテクチャはarm64

Step.1 IDプロパイダの設定

https://docs.github.com/ja/actions/how-tos/secure-your-work/security-harden-deployments/oidc-in-aws#adding-the-identity-provider-to-aws

AWSコンソールのIAM→IDプロパイダ ページから「プロパイダを追加」を選択し、以下の内容でIDプロパイダを作成します。

プロバイダのタイプ: OpenID Connect
URL: https://token.actions.githubusercontent.com
対象者(Audience): sts.amazonaws.com

Step.2 デプロイ用のロールを作成

IAM→ロール ページから「ロールを追加」を選択し、以下の手順でデプロイ用のロールを作成します。

1. 信頼されたエンティティ

repositoryとbranchはオプションですが、セキュリティの観点から設定することをおすすめします。

エンティティタイプ: ウェブアイデンティティ
アイデンティティプロバイダー: Step.1で作成したプロパイダ(token.actions.githubusercontent.com
Audience: sts.amazonaws.com
GitHub organization: 自分のGitHubアカウント名 or 組織名
GitHub repository: Workflowを置くリポジトリ
GitHub branch: デプロイ対象のブランチ

2. 許可を追加

今回は最小権限の原則に則り必要最低限の権限のみを持つワークフローを作成します。このステップは飛ばして何も選択せずに次に進んでください。
余計なのを選択するとそれだけセキュリティ上のリスクが上がるだけです。

3. 名前、確認、および作成

適当なロール名と説明を追加してロールを作成します。

Step.3 ロールにポリシーを追加

ポリシーを設定

作成したロールの詳細ページにアクセスし、「許可ポリシー→許可を追加→インラインポリシーを作成」でポリシーを追加します。


「ポリシーの作成」ページに飛んだらサービスからLambdaを選択し、「アクション 許可」のセクションで以下の権限を追加します。

UpdateFunctionCode
UpdateFunctionConfiguration
GetFunctionConfiguration

ARNを追加

続いて「リソース」セクションでfunctionの「ARNを追加」をクリックします。

「ARNを指定」というダイアログが開くので、リージョンと関数名(Resource function name)を設定します。関数名にはその名の通りデプロイ対象のLambda関数名を設定してください。ARNを追加したら「次へ」をクリックします。

確認して作成

ポリシー名を聞かれるので適当に入力してポリシーの作成を完了します。

Step.4 GitHub側で環境変数を設定

通常のGitHub Actionsのリポジトリにシークレットを追加するのと同様の手順で、以下のシークレット(環境変数)を追加します。別にsecretである必要はありませんがアカウントIDなどを公開するのも微妙なのでsecret扱いにしています。

AWS_LAMBDA_REGION

デプロイ先のリージョン(ap-southeast-1など)

AWS_LAMBDA_DEPLOY_ROLE_ARN

Step.3 で作成したロールのARN(arn:aws:iam::[アカウントID]:role/[ロール名]の形式)

Step.5 workflowを作成

ここまでの手順が完了したらあとは実際にworkflowを作成するだけです。今回はシンプルなGoで書いた関数をデプロイしています。

最後のステップはaws-actions/aws-lambda-deploy@v1のリポジトリのREADMEを見て適当に設定してください。
https://github.com/aws-actions/aws-lambda-deploy

この手順に関しては他の記事を見たほうが早いと思われるので詳しい説明は省略します。

name: Deploy to AWS Lambda

on:
  push:
    branches: [ "main" ]

permissions: {}

jobs:
  deploy:
    name: Update functions
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read

    steps:
    - name: Checkout
      uses: actions/checkout@v5

    - name: Setup Go
      uses: actions/setup-go@v5
      with:
        go-version: '1.24.3'

    - name: Build
      run: |
        GOOS=linux GOARCH=arm64 go build -o bootstrap
        mkdir deploy
        cp bootstrap deploy/
    
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v4
      with:
        aws-region: ${{ secrets.AWS_LAMBDA_REGION }}
        role-to-assume: ${{ secrets.AWS_LAMBDA_DEPLOY_ROLE_ARN }}
        role-session-name: lambda-deploy

    - name: Deploy Lambda Function
      uses: aws-actions/aws-lambda-deploy@v1
      with:
        function-name: [Lambdaの関数名]
        code-artifacts-dir: deploy
        handler: main.handler
        runtime: provided.al2023 # Amazon Linux 2023
        architectures: arm64

Done!

以上で完了です。上手く動かないときは各所で設定したリポジトリ名や関数名、ブランチ名、リージョンが正しいか、設定したポリシーに漏れがないかを確認してください。

Discussion