[GitHub Actions] ARM64 アーキテクチャのランナーで、AWS CDK での esbuild による Lambda 関数のビルドおよびデプロイをしてみた
こんにちは、製造ビジネステクノロジー部の若槻です。
最近のGitHub Actionsのアップデートで、 ARM64 アーキテクチャのランナーがベータ版で利用可能になりました。
オフィシャルのアナウンスはこちらです。
実際に試してみたブログはこちらです。
今回は、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 のワークフロー
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 は以下の通りです。
{
"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 関数を作成します。
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 アーキテクチャに依存しないものとしています。
export const handler = (): void => {
console.log('Hello, CDK!');
};
動作確認
ワークフローを実行すると、Lambda 関数のビルドが成功し、Lambda 関数をデプロイできました。
デプロイした関数を実行すると、正常に動作しました。
ARM64 アーキテクチャのランナーで Lambda 関数をビルドおよびデプロイできることを確認できました。
@esbuild/linux-arm64 の利用は不要だった
当初は下記の esbuild の Linux ARM 64-bit バイナリである @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 アーキテクチャとしても良いのではないでしょうか。
参考
以上