Github Actionsを利用してAWS Lambdaに自動デプロイをしてみた

2022.07.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、コンサル部@大阪オフィスのTodaです。

AWS Lambdaのプログラムを構築していて、Githubにプッシュをした時に自動デプロイができないか調べていましてGithub Actionsを利用する方法がございましたので試してみました。

Github Actionsについて

Github ActionsはGithubが提供するCI/CDのためのためのワークフローエンジンで、GitHubから直接コードをビルド、テスト、デプロイを自動でする事が可能になります。

■ アイデアからリリースまでのワークフローを自動化 - GitHub Actions
https://github.co.jp/features/actions

実装したいこと

  • Github内の指定ブランチにプッシュしたタイミングで自動デプロイをする。
  • 変更可能なLambda関数を指定する。
  • IAMロールを利用してAWSとの連携をおこなう。

事前の準備

Lambda関数とプログラムを管理するリポジトリをそれぞれ1点用意いたします。
Lambda関数は今回、Python3.9を使うようにしています。
リポジトリ内のフォルダ・ファイル構成は下記のようになっています。

リポジトリ内のフォルダ・ファイル構成

試してみる

AWSマネージメントコンソールにログイン

対象のLambda関数が配置されているAWSマネージメントコンソールにログインをします。

IAM IDプロバイダの登録

サービスメニューから[IAM]を選択して、左メニューから[IDプロバイダー]を選択します。
[IDプロバイダを追加]をクリックします。
プロバイダの設定画面では下記入力をおこないます。

  • プロバイダのタイプ:OpenID Connect
  • プロバイダの URL:https://token.actions.githubusercontent.com
    • URL入力後、[サムプリントを取得]をクリックします。
  • 対象者:sts.amazonaws.com

入力後は、[プロバイダを追加]にて登録操作を完了します。

IAMポリシーの登録

左メニューから[ポリシー]を選択して、[ポリシーの作成]をクリックします。
JSONタブをクリックして下記情報を入力します。
入力後は次のステップをクリックしてポリシー名を設定して登録を完了します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:UpdateFunctionCode"
            ],
            "Resource": "(更新したいLambda関数のARNを指定 ※複数指定可)"
        }
    ]
}

IAMロールの登録

左メニューから[ロール]を選択して、[ロールの作成]をクリックします。
プロバイダの設定画面では下記入力をおこないます。

  • エンティティタイプ:ウェブアイデンティティ
  • プロバイダー:token.actions.githubusercontent.com
  • Audience:sts.amazonaws.com

入力後は、[次へ]をクリックして許可ポリシーにて「先ほど作成したポリシー」を選択します。
選択後、[次へ]をクリックして確認画面に進めます。

確認画面では「ロール名」と「信頼されたエンティティ」の設定を変更します。
「信頼されたエンティティ」の設定は決まったGitHubリポジトリからのみAssumeRole出来るようにする対応で必ず設定いたします。
信頼されたエンティティでの制限については下記記事にて詳細を載せていますのでご確認ください。

・信頼されたエンティティのサンプル

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::{ACCOUNT_ID}:oidc-provider/token.actions.githubusercontent.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringLike": {
          "vstoken.actions.githubusercontent.com:sub": "repo:{GITHUB_ORGANIZATION_NAME}/{GITHUB_REPO_NAME}:*"
        }
      }
    }
  ]
}

上記サンプルの中で3点を適切な内容に書き換えます。

  • {ACCOUNT_ID}
  • {GITHUB_ORGANIZATION_NAME}
  • {GITHUB_REPO_NAME}

「ロール名」と「信頼されたエンティティ」の設定後に登録を完了します。
後程、作成したIAMロールのARNが必要となりますのでメモに残します。
上記でAWS側のリソース作成は完了になります。

Github Actionsへのシークレット情報登録

Github Actionsで利用するシークレット情報を登録します。
Githubの対象リポジトリ画面を開き、[Settings] > [Secrets] > [Actions]クリックします。 画面内の[New repository secret]をクリックします。

Github Actionsへのシークレット情報登録Github Actionsへのシークレット情報登録

シークレットとして下記2点の情報を登録します。

  • 1点目
    • Name : AWS_ROLE_ARN
    • Value : IAMロールのARN (IAMロール作成時に取得)
  • 2点目
    • Name : AWS_REGION
    • Value : Lambdaの保管されているリージョン (例:ap-northeast-1)

上記でGitHub側の設定は完了になります。

deploy.ymlの作成

リポジトリと連携しているファイル構成内にdeploy.ymlを新規作成します。
下記、内容をペーストします。
当ファイルはPython3で記入されたLambda関数をデプロイすることを想定しています。
スクリプト内3~5行目が自動デプロイを動かす際のブランチ指定になります。
下記の場合は「master」にプッシュされた場合に自動デプロイが実行されます。

name: AWS Lambda Deploy 
on:
  push:
    branches:
      - master
jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read

    steps:
      - name: checkout
        uses: actions/checkout@v3

      - name: configure-aws-credentials
        uses: aws-actions/configure-aws-credentials@master
        with:
          aws-region: ${{ secrets.AWS_REGION }}
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
          role-session-name: GitHubActions

      - name: get-caller-identity is allowed to run on role.
        run: aws sts get-caller-identity

      - name: setup-python
        uses: actions/setup-python@v3
        with:
          python-version: '3.x'

      - name: lambda update
        run: |
          pip3 install awscli
          cd lambda && zip -r package.zip ./*
          aws lambda update-function-code --function-name test-http --zip-file fileb://package.zip --publish

ファイルを保存したらリポジトリへのプッシュ操作をおこないます。
上記でファイルの配置も完了して自動デプロイが可能な状態になります。

試してみる

ディレクトリ内に保存されている「lambda_function.py」を操作して変更内容をコミット、プッシュします。

Github画面内の[Actions]を選択する事でワークフローの状態を確認する事ができます。
正常に完了をした場合は、緑チェックマークにて完了となります。

Github画面内のActions

AWS Lambdaの編集画面を表示する事でプログラム内容が変わっている点と、 バージョンタブにて新しいバージョンが登録されていることがわかります。

AWS Lambdaの編集画面

さいごに

Github Actionsを利用したAWS Lambdaへの自動デプロイを試してみました。
今回はGitHubとIAMに関する設定のみで導入する事ができ、簡易に実装する事ができました。
規模が大きいLambda処理の場合はデプロイに時間がかかる場合がございますが、規模が小さく簡易に自動デプロイを導入したい場合に選択肢にあがってくるかと考えます。 また、Codeシリーズを利用した自動デプロイも今度試してみたいと考えております。
少しでもお客様の作りたい物の参考になればと考えております。

変更履歴

  • IAMロールの作成・登録手順にて信頼されたエンティティの設定が抜けておりました。 決まったGitHubリポジトリからのみ処理を付け付けるように信頼されたエンティティを設定しております。