Windows ローカル環境から Go Lambda を CDK でデプロイしてみた
こんにちは!製造ビジネステクノロジー部の小林です。
今回は、Windowsローカル環境から Go で書いた Lambda 関数を AWS CDK を使ってデプロイする検証を行いました。Go は初めて触るため、色々と調査しながらの検証となりました。
Docker Desktop や WSL2 は使用せず、Windows ネイティブ環境で完結する手順を紹介します。
前提条件
この記事では、以下の環境を前提としています。
動作環境
OS: Windows 11
開発環境: Windows ネイティブ(Docker Desktop / WSL2 不要)
以下のツールがインストール済みであることを前提とします。
- Node.js
- npm
- Go
- AWS CLI
- AWS CDK
Go のインストール
Go は以下のリンクからダウンロードしてインストールできます。
Go Lambda のランタイム
以前は go1.x というマネージドランタイムが提供されていましたが、2024年に非推奨となりました。現在、Go Lambda では以下の2つのカスタムランタイムが提供されています。
| ランタイム | OS | サポート終了日 |
|---|---|---|
provided.al2023 |
Amazon Linux 2023 | 2029年6月30日 |
provided.al2 |
Amazon Linux 2 | 2026年6月30日 |
この記事では provided.al2023 を使用します。
provided.al2023 の特徴
provided.al2023 はカスタムランタイムと呼ばれ、以下の特徴があります。
- 高速な起動: コンパイル済みバイナリを直接実行するため、コールドスタートが速い
- メモリ効率が良い: Go の軽量なランタイムにより、メモリ使用量が少ない
- 長期サポート: 2029年までサポート
- ARM64 対応: AWS Graviton2 プロセッサーで高速・低コスト
bootstrap とは
provided.al2023 ランタイムでは、Lambda が起動時にbootstrap という名前のファイルを探して実行します。これは Lambda の仕様で、名前は変更できません。
起動フロー
Lambda コンテナ起動
↓
/var/task/bootstrap を探す ← この名前は固定!
↓
bootstrap を実行
↓
Lambda Runtime API と通信開始
↓
イベント受信待機
↓
イベント受信 → ハンドラー実行
↓
レスポンス返却
ハンドラーとは
ハンドラーとは、Lambda がイベントを受け取ったときに実行される関数のことです。
他の言語との違いは下記のようになっています。
| 言語 | ハンドラーの指定 |
|---|---|
| Node.js | handler.js ファイルの handler 関数 |
| Python | lambda_function.py ファイルの lambda_handler 関数 |
| Go | bootstrap 実行ファイル(コンパイル済みバイナリ) |
Go の場合、CDK の handler パラメータには実行ファイル名(bootstrap)を指定します。
※実際のロジックを処理する関数(Go コード内の handler 関数)とは別物なので注意
プロジェクト構造
これから作成するプロジェクトの構成を確認します。
go-lambda-cdk/
├── lambda/ # Go Lambda のソースコード
│ ├── main.go
│ ├── go.mod # 依存関係管理(自動生成)
│ ├── go.sum # ロックファイル(自動生成)
│ └── dist/ # ビルド成果物(自動生成)
│ └── bootstrap
├── cdk/ # CDK プロジェクト
│ ├── bin/
│ │ └── app.ts
│ ├── lib/
│ │ └── lambda-stack.ts
│ ├── package.json
│ ├── cdk.json
│ └── tsconfig.json
└── .gitignore
では、セットアップを行います。
プロジェクトの作成
# プロジェクトのルートディレクトリを作成
mkdir go-lambda-cdk
cd go-lambda-cdk
# Lambda 用と CDK 用のディレクトリを作成
mkdir lambda infrastructure
作成後のディレクトリ構造
go-lambda-cdk/
├── lambda/ ← Go Lambda のコードを配置
└── infrastructure/ ← CDK のコードを配置
Go Lambda の初期化
# lambda ディレクトリに移動
cd lambda
# Go モジュールを初期化
go mod init lambda
# AWS Lambda 用のライブラリをインストール
go get github.com/aws/aws-lambda-go/lambda
コマンドの説明
go mod init lambda
- Go プロジェクトの初期化
- このコマンドを実行すると、go.mod ファイルが作成されます。
go get github.com/aws/aws-lambda-go/lambda
- AWS Lambda 用ライブラリのインストール
- AWS 公式の Go Lambda ライブラリをダウンロード
- Lambda Runtime API との通信を処理
- go.mod ファイルに依存関係を追加
- go.sum ファイルを生成(ロックファイル)
- Node.js の npm install や Python の pip install に相当
Lambda 関数の実装
lambda/main.go ファイルを作成し、以下のソースを記述します。
// lambda/main.go
package main
import "github.com/aws/aws-lambda-go/lambda"
// handler は Lambda から呼ばれたときに実行される関数
func handler() (string, error) {
return "Hello, World!", nil
}
// main は Lambda の起動時に実行される関数
func main() {
// handler 関数を Lambda に登録
lambda.Start(handler)
}
ポイント
package main
- Go のエントリーポイントとなるパッケージ
import "github.com/aws/aws-lambda-go/lambda"
- 先ほどインストールした AWS Lambda ライブラリをインポート
handler 関数
func handler() (string, error) {
return "Hello, World!", nil
}
Lambda がイベントを受け取ったときに実行される関数(ハンドラー)
main 関数
- プログラムのエントリーポイント
- ハンドラー関数を Lambda Runtime API に登録
- この関数が呼ばれると、Lambda がイベントを待機する状態になる
CDK プロジェクトの作成
CDK の初期化
# プロジェクトルートに戻る
cd ..
# infrastructure ディレクトリに移動
cd infrastructure
# CDK プロジェクトを初期化(TypeScript)
cdk init app --language typescript
# 必要なライブラリをインストール
npm install aws-cdk-lib constructs
CDK スタックの実装
cdk init で自動生成されたスタックファイルを、Go Lambda 用に書き換えます。
infrastructure/lib/main-stack.ts
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as path from 'path';
import { Construct } from 'constructs';
export class MainStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const lambdaFunction = new lambda.Function(this, 'Default', {
runtime: lambda.Runtime.PROVIDED_AL2023,
handler: 'bootstrap',
code: lambda.Code.fromAsset(path.join(__dirname, '../../lambda/dist')),
architecture: lambda.Architecture.X86_64,
timeout: cdk.Duration.seconds(10),
});
}
}
ポイント
runtime: lambda.Runtime.PROVIDED_AL2023,
- Go 用のカスタムランタイムを指定
handler: 'bootstrap'
- 実行ファイル名を指定(Go の場合は必ず bootstrap)Lambda が起動時に探すファイル名
code: lambda.Code.fromAsset(path.join(__dirname, '../../lambda/dist')),
- ビルド済みバイナリの場所を指定
architecture: lambda.Architecture.X86_64
- CPU アーキテクチャを指定
- X86_64: Intel/AMD の 64 ビット(標準)
- ARM_64: AWS Graviton2(より高速・低コスト)
ビルドとデプロイ
Go Lambda をビルド
Windows 環境で Linux 用のバイナリを生成します。
cd lambda
$env:GOOS="linux"; $env:GOARCH="amd64"; $env:CGO_ENABLED="0"; go build -o dist/bootstrap main.go
cd ..
環境変数の説明
| 環境変数 | 設定値 | 意味 | 説明 |
|---|---|---|---|
GOOS |
linux |
ターゲット OS | Lambda は Linux 環境で動作するため、Linux 用にビルド |
GOARCH |
amd64 |
ターゲットアーキテクチャ | x86_64(64ビット Intel/AMD プロセッサ) |
CGO_ENABLED |
0 |
C 言語連携の無効化 | 純粋な Go バイナリを生成(依存関係を最小化) |
コマンドオプション
| オプション | 説明 |
|---|---|
-o dist/bootstrap |
出力ファイル名を dist/bootstrap に指定 |
main.go |
ビルド対象のソースファイル |
クロスコンパイルとは?
クロスコンパイルとは、開発環境とは異なる OS やアーキテクチャ向けのバイナリを生成する技術です。
今回のケース
開発環境: Windows (amd64)
↓
Go コンパイラ
↓
ターゲット環境: Linux (amd64)
ビルド後の確認
ビルドが成功すると、lambda/dist/にバイナリファイルが生成されます。
CDK デプロイ
ビルドが完了したら、CDK でデプロイします。
cd infrastructure
npx cdk deploy
cd ..
これで、Windows 環境から Go Lambda のビルドとデプロイが完了しました。次に動作確認を行います。
動作確認
実際に Lambda 関数が動作するか確認してみます。
AWS コンソールにログインし、対象のLambda関数の画面を開きます。

テストタブを開いてテストイベントを実行します。

テストが実行されると、実行結果が表示されます。
Lambda関数が実行され、「Hello, world!」が表示されました。

これで、Windows ローカル環境でビルドした Go Lambda が AWS 上で正常に動作していることが確認できました!
おわりに
今回は、Windows ローカル環境から Go Lambda を CDK でデプロイする手順を紹介しました。Go の公式ドキュメントに時々出てくるゴーファーが気に入ってしまいました。これから Go を学んでいくモチベーションになりそうです!
次回は GitHub Actionsで Go Lambda をビルド&デプロイする実装をやってみたいと思います。
この記事がどなたかの参考になれば幸いです。
参考リンク







