💿
GitHub Actionsを使って、マージ時にAWS Lambdaへデプロイする
はじめに
Nodeで作成したファイルをGitHub Actionsを使ってAWS lambdaにデプロイする方法を書いていきます。
フォルダ構成は次のような感じ
.
├── fuga.py
├── lambda
│ └─── when-file-uploaded.mjs
├── .node-version
├── package-lock.json
└── package.json
when-file-uploaded.mjsの中身はこんな感じ
import { S3 } from '@aws-sdk/client-s3';
console.log('Loading function');
const s3 = new S3();
export const handler = async (event) => {
console.log('Received event:', JSON.stringify(event, null, 2));
// Get the object from the event and show its content type
const bucket = event.Records[0].s3.bucket.name;
const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
const params = {
Bucket: bucket,
Key: key,
};
try {
const { ContentType } = await s3.getObject(params);
console.log('CONTENT TYPE:', ContentType);
return ContentType;
} catch (err) {
console.log(err);
const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`;
console.log(message);
throw new Error(message);
}
};
IAM Identity プロバイダを登録する
手順
- IAM プロバイダを開き、プロバイダを追加を選択
- OpenID Connectを選択
- プロバイダのURLに"https://token.actions.githubusercontent.com"と入力
- 『サムプリントを取得』を押す
- 対象者に"sts.amazonaws.com"と入力
- 『プロバイダを登録する』を押す
IAMポリシーを作成
手順
- IAMポリシーを開き、作成を選択
- サービスでLambdaを選択
- アクション許可で"UpdateFunctionCode"を選択
- リソースで『ARNを追加』を選択
- 対象のLambda情報を入力(テキストを選択して、LambdaのARNを入力するのが簡単だと思う)
デプロイする対象のLambdaをここで全て入力する。 - 次へを押す
- ポリシー名と詳細を書いて作成を押す
IAMロールを登録
手順
- 『信頼されたエンティティタイプ』で『ウェブアイデンティティ』を選択
- 『アイデンティティプロバイダー』で"token.actions.githubusercontent.com"
- 『Audience』で"sts.amazonaws.com"を選択
- GitHubの組織、リポジトリ、ブランチ名(空だと全てのブランチが対象となる)を入力して次へを押す
- 許可ポリシーで『IAMポリシーを作成』の時に作成したポリシーを選択して次へを押す
- ロール名を入力する
- 信頼されたエンティティを選択するで、"token.actions.githubusercontent.com:sub"の項目を以下のようになっているか確認特定のリポジトリからのみからしかデプロイできなくする設定なので必ずチェックする)
"token.actions.githubusercontent.com:sub": [ "repo:{組織名}/{リポジトリ名}:*" ]
GitHub Actionsでシークレットを登録
- GitHubのリポジトリのページへ行き、Setting→Secrets→Actions→New Repository Secretをクリック
- シークレットに以下を登録
AWS_ROLE_ARN: 作成したIAMロールのARN
AWS_REGION: Lambdaが置いてあるリージョン - Actions variablesで以下を登録
NODE_VERSION: Nodeのバージョン
deploy.ymlの作成
- .github/workflows/deploy.ymlを作成する。例は下記
name: AWS Lambda Deploy
on:
push:
branches:
- main
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: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: npm install, build, and test
run: |
npm install
npm run build --if-present
- name: lambda update
run: |
cd lambda && zip -r package.zip ./*
aws lambda update-function-code --function-name {lambdaの関数名} --zip-file fileb://package.zip --publish
マージする
上記のdeploy.ymlの設定だと、mainにマージするとGitHub Actionsが実行されるので、マージして確認する。
終わりに
今後次の2点に対応したいと思ってます。
- TypeScriptで書いた関数をトランスパイルしてデプロイする。
- PrismaのようなORMを入れてDBに書き込みたい。
参考にしたページ
Discussion