GitHub Actions から Go で書いた Lambda 関数をデプロイしてみた

GitHub Actions から Go で書いた Lambda 関数をデプロイしてみた

2025.11.15

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

前回の記事ではローカル環境から Go で書いた Lambda 関数をデプロイする手順をご紹介しました。
https://dev.classmethod.jp/articles/shoma-deploy-go-lambda-with-cdk-from-windows-local-environment/

今回は、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
// 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 公式が提供しているため、一定の信頼性があります。
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-lambda-go-alpha-readme.html

パッケージのインストール

Go の Lambda 関数専用のパッケージをインストールします。

cd infrastructure
npm install @aws-cdk/aws-lambda-go-alpha

Lambda関数の定義

CDK スタックで Go の Lambda 関数を定義します。

infrastructure/lib/main-stack.ts
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 のワークフローファイルを作成します。

.github/workflows/go.yml
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 コマンドを明示的に実行する必要はありません。
https://github.com/actions/setup-go

動作確認

それでは実際に GitHub Actions を使用してデプロイを行ってみましょう。

GitHub のリポジトリページから「Actions」タブをクリックします。
スクリーンショット 2025-11-15 23.23.29

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

ワークフローが開始されました。
スクリーンショット 2025-11-15 23.30.25

Go のビルドが完了し、CDK デプロイが開始されました。
スクリーンショット 2025-11-15 23.47.39

無事デプロイ が完了しました。
スクリーンョット 2025-11-15 23.48.29

CloudFormation のリソース一覧から、Lambda 関数が作成されたことが確認できます。
スクリーンショット 2025-11-15 23.56.26

Lambda 関数をテスト実行すると、Hello, World! が正常に返されました!
スクリーンショット 2025-11-15 23.57.55

おわりに

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

この記事をシェアする

FacebookHatena blogX

関連記事