[GitHub Actions] ARM64 アーキテクチャのランナーで、AWS CDK での esbuild による Lambda 関数のビルドおよびデプロイをしてみた

[GitHub Actions] ARM64 アーキテクチャのランナーで、AWS CDK での esbuild による Lambda 関数のビルドおよびデプロイをしてみた

Clock Icon2024.07.27

こんにちは、製造ビジネステクノロジー部の若槻です。

最近のGitHub Actionsのアップデートで、 ARM64 アーキテクチャのランナーがベータ版で利用可能になりました。

オフィシャルのアナウンスはこちらです。

https://github.blog/jp/2024-06-07-arm64-on-github-actions-powering-faster-more-efficient-build-systems/

実際に試してみたブログはこちらです。

https://dev.classmethod.jp/articles/arm64-architecture-runners-in-github-actions-beta/

今回は、GitHub Actions で構築した CI/CD パイプラインでよくあるユースケースとして、AWS CDK での esbuild による Lambda 関数のビルドおよびデプロイを ARM64 アーキテクチャのランナーで試してみました。

試してみた

環境

$ npm ls aws-cdk esbuild
(中略)
└─┬ iac@0.0.0-github-release -> ./packages/iac
  ├── aws-cdk@2.149.0
  └── esbuild@0.23.0

使用する GitHub Actions ランナー

以前のブログで作成した、ARM64 アーキテクチャの GitHub-hosted ランナーを使用します。

GitHub Actions のワークフロー

.github/workflows/manual-deploy.yml
name: CDK Deploy Manually

on: workflow_dispatch

jobs:
  Deploy:
    runs-on:
      labels: arm64_ubuntu2404_2core # ARM64 ランナーを指定
    timeout-minutes: 30
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node.js 20
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: npm

      - name: Cache Dependency
        uses: actions/cache@v4
        id: cache_dependency
        env:
          cache-name: cache-dependency
        with:
          path: "**/node_modules"
          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }}

      - name: Install Dependency
        if: ${{ steps.cache_dependency.outputs.cache-hit != 'true' }}
        run: npm ci --no-audit --progress=false --silent

      - name: Assume Role
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: "ap-northeast-1"
          role-to-assume: ${{ vars.DEV_AWS_OIDC_ROLE_ARN }}

      # Lambda 関数のビルド
      - name: CDK Synth
        run: |
          npm run synth:sample-stack -w iac

      # Lambda 関数のデプロイ
      - name: CDK Deploy
        run: |
          npm run deploy:sample-stack -w iac

CDK ビルドおよびデプロイにしている npm script は以下の通りです。

packages/iac/package.json
{
  "name": "iac",
  "version": "0.0.0-github-release",
  "bin": {
    "iac": "bin/iac.js"
  },
  "scripts": {
    "deploy:sample-stack": "cdk deploy --require-approval never SampleStack",
    "synth:sample-stack": "cdk synth SampleStack"
  }
  // 以下略
}

CDK および Lambda 関数のコード

aws_lambda_nodejsモジュールを使用して、ARM64 アーキテクチャの Lambda 関数を作成します。

packages/iac/lib/sample-stack.ts
import { aws_lambda_nodejs, Stack, aws_lambda } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    new aws_lambda_nodejs.NodejsFunction(this, 'SampleFunc', {
      runtime: aws_lambda.Runtime.NODEJS_20_X,
      architecture: aws_lambda.Architecture.ARM_64,
    });
  }
}

関数のハンドラーコード自体は ARM64 アーキテクチャに依存しないものとしています。

packages/iac/lib/sample-stack.SampleFunc.ts
export const handler = (): void => {
  console.log('Hello, CDK!');
};

動作確認

ワークフローを実行すると、Lambda 関数のビルドが成功し、Lambda 関数をデプロイできました。

デプロイした関数を実行すると、正常に動作しました。

ARM64 アーキテクチャのランナーで Lambda 関数をビルドおよびデプロイできることを確認できました。

@esbuild/linux-arm64 の利用は不要だった

当初は下記の esbuild の Linux ARM 64-bit バイナリである @esbuild/linux-arm64 が必要だと想定していましたが、使用せずにビルドさせることができました。

https://www.npmjs.com/package/@esbuild/linux-arm64

しかし ARM64 のネイティブビルドの依存したパッケージやコードをビルドする場合に必要な場面が出てくるかも知れません。

ちなみにこの @esbuild/linux-arm64 Mac のローカル環境では下記のようなエラーとなりインストールできませんでした。インストール先のアーキテクチャをチェックしているようなので、使用する場合は GitHub Actions 上でのみインストールされるようにするなどの運用を検討する必要がありそうです。

$ npm i @esbuild/linux-arm64
npm error code EBADPLATFORM
npm error notsup Unsupported platform for @esbuild/linux-arm64@0.23.0: wanted {"os":"linux","cpu":"arm64"} (current: {"os":"darwin","cpu":"arm64"})
npm error notsup Valid os:   linux
npm error notsup Actual os:  darwin
npm error notsup Valid cpu:  arm64
npm error notsup Actual cpu: arm64
npm error A complete log of this run can be found in: /Users/wakatsuki.ryuta/.npm/_logs/2024-07-27T08_11_51_144Z-debug-0.log

おわりに

GitHub Actions で構築した CI/CD パイプラインでよくあるユースケースとして、AWS CDK での esbuild による Lambda 関数のビルドおよびデプロイを ARM64 アーキテクチャのランナーで試してみました。

ARM64 アーキテクチャのランナーで Lambda 関数をビルドおよびデプロイできることを確認することができました。

x86 アーキテクチャに依存した処理が無いのであれば、GitHub Actions のランナーと Lambda 関数自体のいずれも ARM64 アーキテクチャとしても良いのではないでしょうか。

参考

https://dev.classmethod.jp/articles/local-build-a-lambda-function-nodejs-without-docker-desktop-with-aws-cdk/

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.