GitHub Actions から Go で書いた Lambda 関数をデプロイしてみた
こんにちは。製造ビジネステクのロジー部の小林です。
前回の記事ではローカル環境から Go で書いた Lambda 関数をデプロイする手順をご紹介しました。
今回は、Go で書いた Lambda 関数を GitHub Actions からデプロイする方法を検証してみます。
前提条件
- 必要な AWS リソース
- IAM ロール(GitHub Actions 用・OIDC 信頼関係設定済み)
- OIDC ID プロバイダー(token.actions.githubusercontent.com)
- Go がインストール済み
ディレクトリ構成
最終的なプロジェクト構成は以下のようになります。
go-lambda-actions/
├── .github/
│ └── workflows/
│ └── go.yml # GitHub Actions ワークフロー
├── lambda/
│ ├── main.go # Lambda 関数ソースコード
│ ├── go.mod # Go モジュール定義(自動生成)
│ └── go.sum # 依存関係ロックファイル(自動生成)
└── infrastructure/
├── bin/
│ └── app.ts # CDK アプリケーション
├── lib/
│ └── main-stack.ts # CDK スタック定義
├── package.json
└── cdk.json
Go のソースを作成
lambda ディレクトリで Go モジュールを初期化し、必要なパッケージをインストールします。
cd lambda
go mod init lambda
go get github.com/aws/aws-lambda-go/lambda
Lambda 関数のソースを作成します。
// 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)
}
この Lambda 関数は実行すると Hello, World! を返します。
CDK で Lambda 関数を定義
@aws-cdk/aws-lambda-go-alpha とは?
@aws-cdk/aws-lambda-go-alpha は、AWS CDK で Go の Lambda 関数を簡単にデプロイするための公式パッケージです。
主な機能
- Go のソースから自動的にバイナリをビルド
- クロスコンパイル(開発環境 → Linux)を自動実行
- Dockerまたはローカルの Go を使ってビルド
go.modに基づいた依存関係の自動解決
ポイント
このパッケージは Alpha(実験的)段階のため、将来的に破壊的変更が発生する可能性があります。ただし、AWS 公式が提供しているため、一定の信頼性があります。
パッケージのインストール
Go の Lambda 関数専用のパッケージをインストールします。
cd infrastructure
npm install @aws-cdk/aws-lambda-go-alpha
Lambda関数の定義
CDK スタックで Go の Lambda 関数を定義します。
import * as cdk from 'aws-cdk-lib';
import * as go from '@aws-cdk/aws-lambda-go-alpha';
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 go.GoFunction(this, 'GoLambda', {
entry: '../lambda',
runtime: cdk.aws_lambda.Runtime.PROVIDED_AL2023,
architecture: cdk.aws_lambda.Architecture.ARM_64,
timeout: cdk.Duration.seconds(10),
});
}
}
ポイント
entry:go.modが存在するディレクトリを指定しますruntime:PROVIDED_AL2023を使用(Amazon Linux 2023 ベース、2029年までサポート)architecture:ARM_64(Graviton2)GoFunction: CDK デプロイ時に自動的にgo buildを実行
TypeScriptの Lambda 関数 NodejsFunction と同じように、ソースコードのパスを指定するだけでビルドからデプロイまで自動化されます。
GitHub Actions ワークフローの作成
GitHub Actions のワークフローファイルを作成します。
name: Go Lambda Deploy
# トリガー設定: このワークフローが実行される条件
on:
# Pull Request がトリガー
pull_request:
# PR のライフサイクルイベント
types:
- opened # PR が新規作成されたとき
- synchronize # PR に新しいコミットがプッシュされたとき
- reopened # クローズされた PR が再オープンされたとき
# 対象ブランチ: main ブランチへの PR のみ
branches: [ main ]
# パスフィルター: 以下のファイルが変更された場合のみ実行
paths:
- 'lambda/**' # Lambda 関数のコード変更
- 'infrastructure/**' # CDK インフラストラクチャの変更
- '.github/workflows/go.yml' # このワークフロー自体の変更
# 手動実行を許可(GitHub の Actions タブから実行可能)
workflow_dispatch:
jobs:
build-and-deploy:
runs-on: ubuntu-latest
# Environment: GitHub の Environment 設定を使用
# ASSUME_ROLE_TOKYO_ARN などの変数が定義されている
environment: DEVELOPMENT
# 権限設定: このワークフローに付与される権限
permissions:
id-token: write # OIDC トークンの取得に必要(AWS 認証用)
contents: read # リポジトリのコードを読み取る権限
steps:
# リポジトリのコードをチェックアウト
- uses: actions/checkout@v5
# Go のセットアップ
# CDK が Go のビルドを実行する際に必要
- name: Set up Go
uses: actions/setup-go@v5
with:
# Go のバージョンを明示的に指定
# 省略すると最新の安定版が使用される
go-version: '1.21'
# Node.js のセットアップ
# CDK(TypeScript)の実行に必要
- name: Setup Node.js
uses: actions/setup-node@v4
with:
# Node.js のバージョンを指定
node-version: '22'
# CDK の依存関係をインストール
- name: Install CDK dependencies
run: |
cd infrastructure
npm ci
# AWS 認証(OIDC)
# IAM ロールを AssumeRole して一時的な認証情報を取得
- name: Assume AWS Role for Tokyo
uses: aws-actions/configure-aws-credentials@v4
with:
# Environment 変数から IAM ロールの ARN を取得
# GitHub の Settings > Environments > DEVELOPMENT で設定
role-to-assume: ${{ vars.ASSUME_ROLE_TOKYO_ARN }}
aws-region: ap-northeast-1
# CDK が自動的に Go をビルドし、Lambda 関数にデプロイする
- name: CDK Deploy
run: |
cd infrastructure
# CDK が内部で以下を実行する
# 1. Go のビルド(go build)
# 2. CloudFormation スタックの更新
# 3. Lambda 関数のデプロイ
npx cdk deploy --require-approval never
actions/setup-go とは?
actions/setup-go@v5 は、GitHub Actions で Go 環境をセットアップする公式アクションです。
主な機能
- 指定したバージョンの Go をインストール
- Go の依存関係のキャッシュ(
go.modベース) - クロスプラットフォーム対応(Linux、macOS、Windows)
本ワークフローでの役割
CDK の GoFunction が内部で go build を実行する際に、Go の実行環境(コンパイラやビルドツール)が必要になります。そのため、このステップで Go 環境をセットアップしています。
ポイント
GitHub Actions 上で Go のビルドステップを記述する必要はありません。GoFunction が自動的にビルドを実行するため、go build コマンドを明示的に実行する必要はありません。
動作確認
それでは実際に GitHub Actions を使用してデプロイを行ってみましょう。
GitHub のリポジトリページから「Actions」タブをクリックします。

作成したワークフロー「Go Lambda Deploy」をクリックし、Run Workflow のプルダウンから「Run Workflow」ボタンをクリックしてデプロイを開始します。

ワークフローが開始されました。

Go のビルドが完了し、CDK デプロイが開始されました。

無事デプロイ が完了しました。

CloudFormation のリソース一覧から、Lambda 関数が作成されたことが確認できます。

Lambda 関数をテスト実行すると、Hello, World! が正常に返されました!

おわりに
今回は、Go で書いた Lambda 関数を GitHub Actions からデプロイする方法を検証してみました。@aws-cdk/aws-lambda-go-alpha パッケージを使用することで、ワークフロー内で Go のビルドステップを明示的に記述する必要がなく、シンプルに実装できました。この記事がどなたかの参考になれば幸いです。







