💿

GitHub Actionsを使って、マージ時にAWS Lambdaへデプロイする

2024/05/01に公開

はじめに

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 プロバイダを登録する

手順

  1. IAM プロバイダを開き、プロバイダを追加を選択
  2. OpenID Connectを選択
  3. プロバイダのURLに"https://token.actions.githubusercontent.com"と入力
  4. 『サムプリントを取得』を押す
  5. 対象者に"sts.amazonaws.com"と入力
  6. 『プロバイダを登録する』を押す

IAMポリシーを作成

手順

  1. IAMポリシーを開き、作成を選択
  2. サービスでLambdaを選択
  3. アクション許可で"UpdateFunctionCode"を選択
  4. リソースで『ARNを追加』を選択
  5. 対象のLambda情報を入力(テキストを選択して、LambdaのARNを入力するのが簡単だと思う)
    デプロイする対象のLambdaをここで全て入力する。
  6. 次へを押す
  7. ポリシー名と詳細を書いて作成を押す

IAMロールを登録

手順

  1. 『信頼されたエンティティタイプ』で『ウェブアイデンティティ』を選択
  2. 『アイデンティティプロバイダー』で"token.actions.githubusercontent.com"
  3. 『Audience』で"sts.amazonaws.com"を選択
  4. GitHubの組織、リポジトリ、ブランチ名(空だと全てのブランチが対象となる)を入力して次へを押す
  5. 許可ポリシーで『IAMポリシーを作成』の時に作成したポリシーを選択して次へを押す
  6. ロール名を入力する
  7. 信頼されたエンティティを選択するで、"token.actions.githubusercontent.com:sub"の項目を以下のようになっているか確認特定のリポジトリからのみからしかデプロイできなくする設定なので必ずチェックする)
    "token.actions.githubusercontent.com:sub": [
        "repo:{組織名}/{リポジトリ名}:*"
    ]
    

GitHub Actionsでシークレットを登録

  1. GitHubのリポジトリのページへ行き、Setting→Secrets→Actions→New Repository Secretをクリック
  2. シークレットに以下を登録
    AWS_ROLE_ARN: 作成したIAMロールのARN
    AWS_REGION: Lambdaが置いてあるリージョン
  3. Actions variablesで以下を登録
    NODE_VERSION: Nodeのバージョン

deploy.ymlの作成

  1. .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点に対応したいと思ってます。

  1. TypeScriptで書いた関数をトランスパイルしてデプロイする。
  2. PrismaのようなORMを入れてDBに書き込みたい。

参考にしたページ

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

Discussion