🤖

[2024年2月更新] GitHub Action (OIDC認証) を用いてAWS Lambdaに自動デプロイする方法

2024/02/15に公開

業務内でSlack Botを開発した際に利用した実装方法を取りまとめました。
特にAWSのOIDC周りのUIが新しくなっていたため、備忘録としてまとめましたので参考にしていただければ幸いです。

ベストプラクティス、改善点等ありましたらお気軽にコメントください。

今回実装したSlack Botは定期的にメッセージを投げる簡単なものですが気が向いた際に記事を作成します。

概要

  • 特定ブランチが更新されたらLambdaにソースをデプロイ
  • AWSのアクセスキー&シークレットキーの管理はGithub→Settingsにある"Select and Variables"には持たせずOIDCを用いて認証
    IAMロールのarnを指定するだけで認証ができ、キーの管理が不要なのでめちゃ楽

実装

AWS側

IAM IDプロバイダ登録

  • IAMページ内の左のメニュー"ID プロバイダ"→プロバイダを追加を選択
    id_provider.png

画像に記載の通り入力(以下そのままコピペでOK)

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

  • 入力後、プロバイダのURL項目の右にある"サムプリントを取得"を押下
  • サムプリントを取得をしないとプロバイダの追加ができない

image.png

ロール割り当て

作成したIDプロバイダを選択しロール割り当てを行う

id_provider2.png

エンティティ設定

認証を許可する対象を指定。
GithubのOrganization、repository、branchまで指定可能

私のGithubで例えるとGithub組織だけ"02tYasui"で指定すると私が持っているレポジトリすべて許可することになる
image.png

ポリシー設定
最低限の許可しか与えたくないので一旦そのまま次へを押下(後ほどカスタム)
image.png

ロール名はご自由に
role.png

作成したロールにポリシーを設定

inline.png

Lambdaの更新を許可

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:UpdateFunctionCode"
            ],
            "Resource": "更新したいLambda関数のARN"
        },
        {
        "Effect": "Allow",
        "Action": [
            "iam:PassRole"
        ],
        "Resource": [
            "更新したいLambda関数についているロールのARN"
        ]
    ]
}

image.png

適当なポリシー名を付けてポリシー作成
image.png

エンティティの追加設定

信頼関係→信頼ポリシーを編集を押下
image.png

OIDC用に追加

{
    "Effect": "Allow",
    "Principal": {
        "Service": "lambda.amazonaws.com"
    },
    "Action": "sts:AssumeRole"
}

git2.png

AWS側の設定はこれで完了

Github側

deploy.yml作成

見つけにくいset up a workflow yourselfをクリック
git.png

deploy.yml
masterブランチが更新されたらデプロイ発火

name: Lambda Deploy 
on:
  push:
    branches:
      - main

env:
  REGION_NAME: ap-northeast-1 #region
  FUNCTION_NAME: lambda関数名
  LAMBDA_WORKING_DIRECTORY: function #アプリケーションであればapplicationを記載
  LAMBDA_EXECUTION_ROLE: 更新したいLambda関数についているロールのARN

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

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

        # OIDC
      - name: Configure aws credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ env.LAMBDA_EXECUTION_ROLE }}
          role-session-name: GithubAction
          aws-region: ${{ env.REGION_NAME }}
          
        # 認証
      - name: get-caller-identity is allowed to run on role.
        run: aws sts get-caller-identity

        # Python設定
      - name: setup python
        uses: actions/setup-python@v5
        with:
          python-version: '3.x'

        # Lambdaが存在するか一応確認する
      - name: Check Function if Exists
        id: check-function
        continue-on-error: true
        run: |
          aws lambda get-function --function-name ${{ env.FUNCTION_NAME }}
        
        # デプロイ
      - name: deploy to lambda
      - if: steps.check-function.outcome == 'success'
        run: |
          pip3 install awscli
          cd "リポジトリ内のデプロイ対象Path" && zip -r deploy.zip ./* 
          aws lambda update-function-code --function-name "デプロイ対象の関数名" --zip-file fileb://package.zip --publish

deploy.ymlを作成したら右上の緑ボタンからcommit
image.png

設定はこれで以上

まとめ

リポジトリが更新されるとデプロイが作動する。
OIDCで認証しているので鍵管理が不要になり、今までのGithubのsecretsに鍵を置いておく必要がなくなる。

参考

https://dev.classmethod.jp/articles/lambda-github-actions/

https://qiita.com/shun198/items/89b2e020fa554233aa4c

Discussion