Windows ローカル環境から Go Lambda を CDK でデプロイしてみた

Windows ローカル環境から Go Lambda を CDK でデプロイしてみた

2025.11.13

こんにちは!製造ビジネステクノロジー部の小林です。

今回は、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 は以下のリンクからダウンロードしてインストールできます。
https://go.dev/dl/

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 を使用します。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-golang.html#golang-al1

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関数の画面を開きます。
messageImage_1762974148813

テストタブを開いてテストイベントを実行します。
messageImage_1762974173696
テストが実行されると、実行結果が表示されます。

Lambda関数が実行され、「Hello, world!」が表示されました。
messageImage_1762974187880
これで、Windows ローカル環境でビルドした Go Lambda が AWS 上で正常に動作していることが確認できました!

おわりに

今回は、Windows ローカル環境から Go Lambda を CDK でデプロイする手順を紹介しました。Go の公式ドキュメントに時々出てくるゴーファーが気に入ってしまいました。これから Go を学んでいくモチベーションになりそうです!

次回は GitHub Actionsで Go Lambda をビルド&デプロイする実装をやってみたいと思います。
この記事がどなたかの参考になれば幸いです。

参考リンク

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-golang.html
https://github.com/aws/aws-lambda-go
https://go.dev/doc/install/source#environment

この記事をシェアする

FacebookHatena blogX

関連記事