APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【AWS】AWS Lambda関数の作成・更新を行うAWS公式のGitHub Actionsが公開されました

こんにちは、クラウド事業部の山路です。

今回は表題の通り、AWS Lambda関数の作成・更新を行うGitHub Actionsが公開されたので、少し触ってみました。

aws.amazon.com

github.com

機能概要

GitHub Actionsで aws-lambda-deploy というActionが公開されました。これは configure-aws-credentials などと同様、AWSが公式でサポートするActionです。

本Actionは.zipファイルとコンテナイメージの両方をサポートし、コードのパッケージ化を自動処理します。またGitHubからAWSへの認証にOpenID Connect (OIDC) をサポートしており、安全な通信を実現できます。またこのActionは多くのインプットパラメータが用意されており、ランタイムやメモリサイズ、タイムアウトなどを指定できます。

このActionは、既存のLambda関数を手動で管理する個人やチームに、Lambda関数を自動的に更新する手段を提供します。特にGitHubでLambda関数のコードを管理する場合はスムーズに導入できます。逆に言うと、すでにLambda関数の管理・更新を自動化している組織は利用する機会は少ないかもしれません。また本ActionはLambda関数以外のリソースは対応しないため、別のリソースもまとめて管理する場合は別の方法を取るのが良いでしょう。

機能検証

今回はHello World程度の文字列出力のみを行うLambda関数をGitHub上に用意し、Actionを通じてこの関数をデプロイします。

import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

GitHub Actionsワークフローファイルを配置する前に、ワークフロー内で使用するSecret / Variableの値を登録しておきます。

今回はOIDCを使ってAWSにアクセスするため、GitHub OIDCプロバイダーの登録とIAMロールの作成を事前に行います。またLambda関数を新規に作成する場合はLambdaの実行ロールも用意する必要があります。

IAMロール作成時のログ

# 認証用IAMロールの作成
$ cat trust-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::<AWS Account ID>:oidc-provider/token.actions.githubusercontent.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
        },
        "StringLike": {
          "token.actions.githubusercontent.com:sub": "repo:<GitHub organization>/<GitHub repository name>:*"
        }
      }
    }
  ]
}

$ cat lambda-deploy-policy.json 
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "lambda:UpdateFunctionCode",
        "lambda:GetFunction",
        "lambda:PublishVersion"
      ],
      "Resource": "arn:aws:lambda:*:<AWS Account ID>:function:*"
    },
    {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "arn:aws:iam::<AWS Account ID>:role/*",
      "Condition": {
        "StringEquals": {
          "iam:PassedToService": "lambda.amazonaws.com"
        }
      }
    }
  ]
}

$ aws iam create-role \
>     --role-name GitHubOIDCDeployRole \
>     --assume-role-policy-document file://trust-policy.json

$ aws iam create-policy \
>     --policy-name GitHubLambdaDeployPolicy \
>     --policy-document file://lambda-deploy-policy.json

$ aws iam attach-role-policy \
>     --role-name GitHubOIDCDeployRole \
>     --policy-arn arn:aws:iam::<AWS Account ID>:policy/GitHubLambdaDeployPolicy

# Executionロールの作成
$ cat trust-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

$ aws iam create-role \
>     --role-name lambda-github-actions-execution-role \
>     --assume-role-policy-document file://trust-policy.json

$ aws iam attach-role-policy \
>     --role-name lambda-github-actions-execution-role 
>     --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

※Actionに必要なIAM権限は以下を参照してください。

github.com docs.aws.amazon.com

作成したIAMロールのARNなどをGitHub Secret/Variableに登録します。

ワークフローを実行する準備ができたので、以下のようなファイルを作成・配置します。

name: Deploy to AWS Lambda

on:
  push:
    branches: [ "main" ]

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest

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

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v4
      with:
        role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
        aws-region: ${{ vars.AWS_REGION }}

    - name: Deploy Lambda Function
      uses: aws-actions/aws-lambda-deploy@v1
      with:
        function-name: lambda_github_actions_test
        code-artifacts-dir: my-code-dir
        handler: lambda_function.lambda_handler
        runtime: python3.13
        role: ${{ secrets.AWS_LAMBDA_EXECUTION_ROLE_ARN }}

今回Actionで指定するパラメータは以下の5つです。このうち role 以外は必須パラメータ、Lambda関数を新規作成する場合は role の設定も必要です。

  • function-name: Lambda関数の名称
  • code-artifacts-dir: デプロイ対象のコードを配置したパス
  • handler: Lambda関数ハンドラーの名称 (デフォルトは index.handler)
  • runtime: 関数ランタイム (デフォルトは nodejs20.x)
  • role: ExecutionロールのARN

※その他指定可能なパラメータは以下を参照してください。

github.com

上記ファイルを配置するとワークフローが実行されます。権限周りで特に問題なければワークフローが完了し、指定のLambda関数が作成されたことを確認できるはずです。

試しに関数の一部を修正してLambda関数の更新をしてみても、問題なく更新されることを確認できます。

さいごに

APCはAWS Advanced Tier Services(アドバンストティアサービスパートナー)認定を受けております。


その中で私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp