.zip ファイルアーカイブを使用して Go Lambda 関数をデプロイする - AWS Lambda

.zip ファイルアーカイブを使用して Go Lambda 関数をデプロイする

AWS Lambda 関数のコードは、スクリプトまたはコンパイルされたプログラム、さらにそれらの依存関係で構成されます。デプロイパッケージを使用して、Lambda に関数コードをデプロイします。Lambda は、コンテナイメージと .zip ファイルアーカイブの 2 種類のデプロイパッケージをサポートします。

このページでは、Go ランタイムのデプロイパッケージとして .zip ファイルを作成し、AWS Management Console、AWS Command Line Interface (AWS CLI)および AWS Serverless Application Model (AWS SAM) を使用して関数コードを AWS Lambda にデプロイするために .zip ファイルを使用する方法について説明します。

Lambda は POSIX ファイルアクセス許可を使用するため、.zip ファイルアーカイブを作成する前に、デプロイパッケージフォルダのアクセス許可を設定する必要がある場合があります。

macOS および Linux での .zip ファイルの作成

以下の手順は、go build コマンドを使用して実行ファイルをコンパイルし、Lambda 用の .zip ファイルデプロイパッケージを作成する方法を示しています。コードをコンパイルする前に、GitHub から Lambda パッケージをインストールしていることを確認してください。このモジュールは、ランタイムインターフェイスの実装を提供し、ランタイムインターフェイスは Lambda と関数コード間の相互作用を管理します。このライブラリをダウンロードするには、次のコマンドを実行します。

go get github.com/aws/aws-lambda-go/lambda

関数で AWS SDK for Go を使用している場合は、標準の SDK モジュールセットと、アプリケーションに必要な AWS サービス API クライアントをダウンロードしてください。SDK for Go のインストール方法については、「AWS SDK for Go V2 の使用開始」を参照してください。

指定されたランタイムファミリーの使用

Go は、他のマネージドランタイムとは異なる方法で実装されています。Go は実行可能バイナリにネイティブにコンパイルするため、専用の言語ランタイムは必要ありません。Go 関数を Lambda にデプロイするには、OS 専用ランタイム (provided ランタイム ファミリ) を使用します。

.zip デプロイパッケージを作成するには (macOS/Linux)
  1. アプリケーションの main.go ファイルが含まれているプロジェクトディレクトリで、実行ファイルをコンパイルします。次の点に注意してください。

    • 実行ファイルには bootstrap という名前をつける必要があります。詳細については、「命名」を参照してください。

    • ターゲットの命令セットアーキテクチャを設定します。OS のみのランタイムは、arm64 と x86_64 の両方をサポートします。

    • オプションの lambda.norpc タグを使用して、Lambda ライブラリの Remote Procedure Call (RPC) コンポーネントを除外することができます。RPC コンポーネントは、Go 1.x ランタイムを使用している場合にのみ必要です。RPC を除外すると、デプロイパッケージのサイズが小さくなります。

    arm64 アーキテクチャの場合:

    GOOS=linux GOARCH=arm64 go build -tags lambda.norpc -o bootstrap main.go

    x86_64 アーキテクチャの場合:

    GOOS=linux GOARCH=amd64 go build -tags lambda.norpc -o bootstrap main.go
  2. (オプション) Linux では、CGO_ENABLED=0 set を使用してパッケージをコンパイルする必要がある場合があります。

    GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o bootstrap -tags lambda.norpc main.go

    このコマンドは、標準の C ライブラリ (libc) バージョン用の安定したバイナリパッケージを作成します。このパッケージは、Lambda と他のデバイスでは異なる場合があります。

  3. 実行可能ファイルを .zip ファイルにパッケージ化して、デプロイパッケージを作成します。

    zip myFunction.zip bootstrap
    注記

    bootstrap ファイルは、.zip ファイルのルートに置く必要があります。

  4. 関数を作成します。次の点に注意してください。

    • バイナリ名は bootstrap にする必要がありますが、ハンドラー名は何でもかまいません。詳細については、「命名」を参照してください。

    • --architectures オプションは、arm64 を使用している場合にのみ必須です。デフォルト値は x86_64 です。

    • --role には、実行ロールの Amazon リソースネーム (ARN) を指定します。

    aws lambda create-function --function-name myFunction \ --runtime provided.al2023 --handler bootstrap \ --architectures arm64 \ --role arn:aws:iam::111122223333:role/lambda-ex \ --zip-file fileb://myFunction.zip

Windows での .zip ファイルの作成

次の手順は、GitHub から Windows 用の build-lambda-zip ツールをダウンロードし、実行可能ファイルをコンパイルして、.zip のデプロイパッケージを作成する方法を示しています。

注記

上記を実行していない場合には、git をインストールした上で、お使いの Windows の git 環境変数に %PATH% の実行可能ファイルを追加します。

コードをコンパイルする前に、GitHub から Lambda ライブラリをインストールしていることを確認してください。このライブラリをダウンロードするには、次のコマンドを実行します。

go get github.com/aws/aws-lambda-go/lambda

関数で AWS SDK for Go を使用している場合は、標準の SDK モジュールセットと、アプリケーションに必要な AWS サービス API クライアントをダウンロードしてください。SDK for Go のインストール方法については、「AWS SDK for Go V2 の使用開始」を参照してください。

指定されたランタイムファミリーの使用

Go は、他のマネージドランタイムとは異なる方法で実装されています。Go は実行可能バイナリにネイティブにコンパイルするため、専用の言語ランタイムは必要ありません。Go 関数を Lambda にデプロイするには、OS 専用ランタイム (provided ランタイム ファミリ) を使用します。

.zip デプロイパッケージを作成するには (Windows)
  1. GitHub から build-lambda-zip ツールをダウンロードします。

    go install github.com/aws/aws-lambda-go/cmd/build-lambda-zip@latest
  2. GOPATH のツールを使用して、.zip ファイルを作成します。Go のデフォルトのインストールがある場合、このツールは通常 %USERPROFILE%\Go\bin に置かれています。それ以外の場合は、Go ランタイムをインストールした場所に移動し、次のいずれかの操作を行います。

    cmd.exe

    cmd.exe で、ターゲットの命令セットアーキテクチャに応じて、次のいずれかを実行します。OS のみのランタイムは、arm64 と x86_64 の両方をサポートします。

    オプションの lambda.norpc タグを使用して、Lambda ライブラリの Remote Procedure Call (RPC) コンポーネントを除外することができます。RPC コンポーネントは、Go 1.x ランタイムを使用している場合にのみ必要です。RPC を除外すると、デプロイパッケージのサイズが小さくなります。

    例 — x86_64 アーキテクチャの場合
    set GOOS=linux set GOARCH=amd64 set CGO_ENABLED=0 go build -tags lambda.norpc -o bootstrap main.go %USERPROFILE%\Go\bin\build-lambda-zip.exe -o myFunction.zip bootstrap
    例 — arm64 アーキテクチャの場合
    set GOOS=linux set GOARCH=arm64 set CGO_ENABLED=0 go build -tags lambda.norpc -o bootstrap main.go %USERPROFILE%\Go\bin\build-lambda-zip.exe -o myFunction.zip bootstrap
    PowerShell

    PowerShell で、ターゲットの命令セットアーキテクチャに応じて、次のいずれかを実行します。OS のみのランタイムは、arm64 と x86_64 の両方をサポートします。

    オプションの lambda.norpc タグを使用して、Lambda ライブラリの Remote Procedure Call (RPC) コンポーネントを除外することができます。RPC コンポーネントは、Go 1.x ランタイムを使用している場合にのみ必要です。RPC を除外すると、デプロイパッケージのサイズが小さくなります。

    x86_64 アーキテクチャの場合:

    $env:GOOS = "linux" $env:GOARCH = "amd64" $env:CGO_ENABLED = "0" go build -tags lambda.norpc -o bootstrap main.go ~\Go\Bin\build-lambda-zip.exe -o myFunction.zip bootstrap

    arm64 アーキテクチャの場合:

    $env:GOOS = "linux" $env:GOARCH = "arm64" $env:CGO_ENABLED = "0" go build -tags lambda.norpc -o bootstrap main.go ~\Go\Bin\build-lambda-zip.exe -o myFunction.zip bootstrap
  3. 関数を作成します。次の点に注意してください。

    • バイナリ名は bootstrap にする必要がありますが、ハンドラー名は何でもかまいません。詳細については、「命名」を参照してください。

    • --architectures オプションは、arm64 を使用している場合にのみ必須です。デフォルト値は x86_64 です。

    • --role には、実行ロールの Amazon リソースネーム (ARN) を指定します。

    aws lambda create-function --function-name myFunction \ --runtime provided.al2023 --handler bootstrap \ --architectures arm64 \ --role arn:aws:iam::111122223333:role/lambda-ex \ --zip-file fileb://myFunction.zip

.zip ファイルを使用した Go Lambda 関数の作成と更新

.zip デプロイパッケージを作成すると、このパッケージを使用して新しい Lambda 関数を作成するか、既存の関数を更新できます。.zip パッケージをデプロイするには、Lambda コンソール、AWS Command Line Interface、Lambda API を使用します。AWS Serverless Application Model (AWS SAM) および AWS CloudFormation を使用して、Lambda 関数を作成および更新することもできます。

Lambda の .zip デプロイパッケージの最大サイズは  250 MB (解凍) です。この制限は、Lambda レイヤーを含む、更新するすべてのファイルの合計サイズに適用されることに注意してください。

Lambda ランタイムには、デプロイパッケージ内のファイルを読み取るアクセス許可が必要です。Linux のアクセス権限の 8 進表記では、Lambda には非実行ファイル用に 644 のアクセス権限 (rw-r--r--) が必要であり、ディレクトリと実行可能ファイル用に 755 のアクセス権限 (rwxr-xr-x) が必要です。

Linux と MacOS で、デプロイパッケージ内のファイルやディレクトリのファイルアクセス権限を変更するには、chmod コマンドを使用します。例えば、実行可能ファイルに正しいアクセス許可を付与するには、次のコマンドを実行します。

chmod 755 <filepath>

Windows でファイルアクセス許可を変更するには、「Microsoft Windows ドキュメント」の「Set, View, Change, or Remove Permissions on an Object」を参照してください。

コンソールを使用して .zip ファイルの関数を作成、更新する

新しい関数を作成するには、まずコンソールで関数を作成し、次に .zip アーカイブをアップロードする必要があります。既存の関数を更新するには、その関数のページを開き、同じ手順に従って更新した .zip ファイルを追加します。

.zip ファイルが 50 MB 未満の場合は、ローカルマシンから直接ファイルをアップロードして関数を作成または更新できます。50 MB を超える .zip ファイルの場合は、まず  Amazon S3 バケットにパッケージをアップロードする必要があります。AWS Management Console を使用して Amazon S3 バケットにファイルをアップロードする手順については、「Amazon S3 の開始方法」を参照してください。AWS CLI を使用してファイルをアップロードするには、「AWS CLI ユーザーガイド」の「オブジェクトの移動」を参照してください。

注記

既存のコンテナイメージ関数を変換して .zip アーカイブを使用することはできません。この場合は、新しい関数を作成する必要があります。

新しい関数を作成するには (コンソール)
  1. Lambda コンソールの [関数] ページを開き、[関数の作成] を選択します。

  2. [一から作成] を選択します。

  3. [基本的な情報] で、以下を行います。

    1. [関数名] に、関数名を入力します。

    2. [Runtime (ランタイム)] で、provided.al2023 を選択します。

  4. (オプション) [アクセス権限] で、[デフォルトの実行ロールの変更] を展開します。新しい [実行ロール] を作成することも、既存のロールを使用することもできます。

  5. [関数の作成]を選択します。Lambda は、選択したランタイムを使用して基本的な「Hello world」関数を作成します。

ローカルマシンから  zip アーカイブをアップロードするには (コンソール)
  1. Lambda コンソールの [関数ページ] で、.zip ファイルをアップロードする関数を選択します。

  2. [コード] タブを選択します。

  3. [コードソース] ペインで、[アップロード元] をクリックします。

  4. [.zip ファイル] をクリックします。

  5. .zip ファイルをアップロードするには、次の操作を行います。

    1. [アップロード] をクリックし、ファイルセレクターで .zip ファイルを選択します。

    2. [開く] をクリックします。

    3. [保存] をクリックします。

Amazon S3 バケットから .zip アーカイブをアップロードするには (コンソール)
  1. Lambda コンソールの [関数ページ] で、新しい .zip ファイルをアップロードする関数を選択します。

  2. [コード] タブを選択します。

  3. [コードソース] ペインで、[アップロード元] をクリックします。

  4. [Amazon S3 ロケーション] を選択します。

  5. .zip ファイルの Amazon S3 リンク URL を貼り付けて、[保存] をクリックします。

AWS CLI を使用して .zip ファイルで関数を作成、更新する

AWS CLI を使用して新しい関数を作成したり、.zip ファイルを使用して既存の関数を更新したりできます。create-function コマンドと update-function-code を使用して、.zip パッケージをデプロイします。.zip ファイルが 50 MB 未満の場合は、ローカルビルドマシン上のファイルの場所から .zip パッケージをアップロードできます。サイズの大きいファイルの場合は、Amazon S3 バケットから .zip パッケージをアップロードする必要があります。AWS CLI を使用して Amazon S3 バケットにファイルをアップロードする方法については、「AWS CLI ユーザーガイド」の「オブジェクトの移動」を参照してください。

注記

AWS CLI を使用して Amazon S3 バケットから .zip ファイルをアップロードする場合、このバケットは関数と同じ AWS リージョン に配置する必要があります。

AWS CLI を含む .zip ファイルを使用して新しい関数を作成するには、以下を指定する必要があります。

  • 関数の名前 (--function-name)

  • 関数のランタイム (--runtime)

  • 関数の実行ロール (--role) の Amazon リソースネーム (ARN)

  • 関数コード内のハンドラーメソッド (--handler) の名前

.zip ファイルの場所も指定する必要があります。.zip ファイルがローカルビルドマシン上のフォルダにある場合は、次のコマンド例に示すように、--zip-file オプションを使用してファイルパスを指定します。

aws lambda create-function --function-name myFunction \ --runtime provided.al2023 --handler bootstrap \ --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \ --zip-file fileb://myFunction.zip

Amazon S3 バケット内の .zip ファイルの場所を指定するには、以下のコマンド例にある --code オプションを使用します。S3ObjectVersion パラメータは、バージョン管理下のオブジェクトにのみ使用する必要があります。

aws lambda create-function --function-name myFunction \ --runtime provided.al2023 --handler bootstrap \ --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \ --code S3Bucket=DOC-EXAMPLE-BUCKET,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion

CLI を使用して既存の関数を更新するには、--function-name パラメータを使用して関数の名前を指定します。関数コードの更新に使用する .zip ファイルの場所も指定する必要があります。.zip ファイルがローカルビルドマシン上のフォルダにある場合は、次のコマンド例に示すように、--zip-file オプションを使用してファイルパスを指定します。

aws lambda update-function-code --function-name myFunction \ --zip-file fileb://myFunction.zip

Amazon S3 バケット内の .zip ファイルの場所を指定するには、以下のコマンド例にある --s3-bucket および --s3-key オプションを使用します。--s3-object-version パラメータは、バージョン管理下のオブジェクトにのみ使用する必要があります。

aws lambda update-function-code --function-name myFunction \ --s3-bucket DOC-EXAMPLE-BUCKET --s3-key myFileName.zip --s3-object-version myObject Version

Lambda API を使用して .zip ファイルで関数を作成、更新する

.zip ファイルアーカイブを使用して関数を作成および更新するには、以下の API オペレーションを使用します。

AWS SAM を使用して .zip ファイルで関数を作成、更新する

AWS Serverless Application Model (AWS SAM) は、AWS のサーバーレスアプリケーションの構築と実行のプロセスを合理化するのに役立つツールキットです。YAML または JSON テンプレートでアプリケーションのリソースを定義し、AWS SAM コマンドラインインターフェイス (AWS SAM CLI) を使用して、アプリケーションを構築、パッケージ化、デプロイします。AWS SAM テンプレートから Lambda 関数を構築すると、AWS SAM は関数コードと指定した任意の依存関係を含む .zip デプロイパッケージまたはコンテナイメージを自動的に作成します。AWS SAM を使用して Lambda 関数を構築およびデプロイする方法の詳細については、「AWS Serverless Application Model 開発者ガイドの」の「AWS SAM の開始方法」を参照してください。

AWS SAM を使用して、既存の .zip ファイルアーカイブを使用する Lambda 関数を作成できます。AWS SAM を使用して Lambda 関数を作成するには、.zip  ファイルを Amazon S3 バケットまたはビルドマシンのローカルフォルダに保存します。AWS CLI を使用して Amazon S3 バケットにファイルをアップロードする方法については、「AWS CLI ユーザーガイド」の「オブジェクトの移動」を参照してください。

AWS SAM テンプレートでは、Lambda 関数は AWS::Serverless::Function のリソースにより指定されます。このリソースで次のプロパティを設定し、.zip ファイルアーカイブを使用して関数を作成します。

  • PackageTypeZip に設定

  • CodeUri - 関数コードの Amazon S3 URI、ローカルフォルダへのパス、または FunctionCode オブジェクトに設定

  • Runtime - 選択したランタイムに設定

AWS SAM では、.zip ファイルが 50 MB を超える場合、この .zip ファイルを最初に Amazon S3 バケットにアップロードする必要はありません。AWS SAM では、ローカルビルドマシン上の場所から、最大許容サイズ 250 MB (解凍) の .zip パッケージをアップロードできます。

AWS SAM で .zip ファイルを使用して関数をデプロイする方法の詳細については、「AWS SAM 開発者ガイド」の「AWS::Serverless::Function」を参照してください。

例: provided.al2023 を使って Go 関数を構築するために AWS SAM を使用
  1. 次のプロパティで AWS SAM テンプレートを作成します。

    • [BuildMethod]: アプリケーションのコンパイラを指定します。go1.x を使用します。

    • [ランタイム]provided.al2023 を使用します。

    • [CodeUri]: コードへのパスを入力します。

    • [アーキテクチャ]: arm64 アーキテクチャ用の [arm64] を使用します。x86_64 命令セットアーキテクチャ用の場合、[amd64] を使用するか、または Architectures プロパティを削除します。

    例 template.yaml
    AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Resources: HelloWorldFunction: Type: AWS::Serverless::Function Metadata: BuildMethod: go1.x Properties: CodeUri: hello-world/ # folder where your main program resides Handler: bootstrap Runtime: provided.al2023 Architectures: [arm64]
  2. sam build コマンドを使用して、実行ファイルをコンパイルします。

    sam build
  3. sam deploy コマンドを使用して、関数を Lambda にデプロイします。

    sam deploy --guided

AWS CloudFormation を使用して .zip ファイルで関数を作成、更新する

AWS CloudFormation を使用して、.zip ファイルアーカイブを使用する Lambda 関数を作成できます。.zip ファイルから Lambda 関数を作成するには、最初にファイルを Amazon S3 バケットにアップロードする必要があります。AWS CLI を使用して Amazon S3 バケットにファイルをアップロードする方法については、「AWS CLI ユーザーガイド」の「オブジェクトの移動」を参照してください。

AWS CloudFormation テンプレートでは、Lambda 関数は AWS::Lambda::Function のリソースにより指定されます。このリソースで次のプロパティを設定し、.zip ファイルアーカイブを使用して関数を作成します。

  • PackageTypeZip に設定

  • CodeS3Bucket および S3Key フィールドに Amazon S3 バケット名と .zip ファイル名を入力

  • Runtime - 選択したランタイムに設定

AWS CloudFormation が生成する .zip ファイルは、4 MB を超えることはできません。AWS CloudFormation で .zip ファイルを使用して関数をデプロイする方法の詳細については、「AWS CloudFormation ユーザーガイド」の「AWS::Lambda::Function」を参照してください。

依存関係の Go レイヤーを作成する

注記

Go のようなコンパイル済み言語の関数でレイヤーを使用しても、Python のようなインタープリター言語と同じメリットが得られない場合があります。Go はコンパイル済み言語なので、関数は初期化フェーズで共有アセンブリを手動でメモリに読み込む必要があり、コールドスタート時間が長くなる可能性があります。代わりに、コンパイル時にすべての共有コードを含めて、組み込みコンパイラ最適化機能を活用することをお勧めします。

このセクションでは、依存関係をレイヤーに含める方法について説明します。

Lambda は、/opt/lib ディレクトリ内のライブラリ、および /opt/bin ディレクトリ内のバイナリを自動的に検出します。Lambda がレイヤーのコンテンツを正しく検出できるように、次の構造でレイヤーを作成します。

custom-layer.zip └ lib | lib_1 | lib_2 └ bin | bin_1 | bin_2

レイヤーをパッケージ化したら、「Lambda でのレイヤーの作成と削除」および「関数へのレイヤーの追加」を参照してレイヤーの設定を完了してください。