[2024年2月更新] GitHub Action (OIDC認証) を用いてAWS Lambdaに自動デプロイする方法
業務内でSlack Botを開発した際に利用した実装方法を取りまとめました。
特にAWSのOIDC周りのUIが新しくなっていたため、備忘録としてまとめましたので参考にしていただければ幸いです。
ベストプラクティス、改善点等ありましたらお気軽にコメントください。
今回実装したSlack Botは定期的にメッセージを投げる簡単なものですが気が向いた際に記事を作成します。
概要
- 特定ブランチが更新されたらLambdaにソースをデプロイ
- AWSのアクセスキー&シークレットキーの管理はGithub→Settingsにある"Select and Variables"には持たせずOIDCを用いて認証
→IAMロールのarnを指定するだけで認証ができ、キーの管理が不要なのでめちゃ楽
実装
AWS側
IAM IDプロバイダ登録
- IAMページ内の左のメニュー"ID プロバイダ"→プロバイダを追加を選択
画像に記載の通り入力(以下そのままコピペでOK)
プロバイダのタイプ:OpenID Connect
プロバイダのURL:https://token.actions.githubusercontent.com
対象者:sts.amazonaws.com
- 入力後、プロバイダのURL項目の右にある"サムプリントを取得"を押下
- サムプリントを取得をしないとプロバイダの追加ができない
ロール割り当て
作成したIDプロバイダを選択しロール割り当てを行う
エンティティ設定
認証を許可する対象を指定。
GithubのOrganization、repository、branchまで指定可能
私のGithubで例えるとGithub組織だけ"02tYasui"で指定すると私が持っているレポジトリすべて許可することになる
ポリシー設定
最低限の許可しか与えたくないので一旦そのまま次へを押下(後ほどカスタム)
ロール名はご自由に
作成したロールにポリシーを設定
Lambdaの更新を許可
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:UpdateFunctionCode"
],
"Resource": "更新したいLambda関数のARN"
},
{
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": [
"更新したいLambda関数についているロールのARN"
]
]
}
適当なポリシー名を付けてポリシー作成
エンティティの追加設定
信頼関係→信頼ポリシーを編集を押下
OIDC用に追加
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
AWS側の設定はこれで完了
Github側
deploy.yml作成
見つけにくいset up a workflow yourself
をクリック
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
設定はこれで以上
まとめ
リポジトリが更新されるとデプロイが作動する。
OIDCで認証しているので鍵管理が不要になり、今までのGithubのsecretsに鍵を置いておく必要がなくなる。
参考
Discussion