.zip ファイルアーカイブを使用して Go Lambda 関数をデプロイする
AWS Lambda 関数のコードは、スクリプトまたはコンパイルされたプログラム、さらにそれらの依存関係で構成されます。デプロイパッケージを使用して、Lambda に関数コードをデプロイします。Lambda は、コンテナイメージと .zip ファイルアーカイブの 2 種類のデプロイパッケージをサポートしています。
このページでは、Go ランタイムのデプロイパッケージとして .zip ファイルを作成し、AWS Lambda (AWS Command Line Interface) を使用して関数コードを AWS CLI にデプロイするために .zip ファイルを使用する方法について説明します。
セクション
前提条件
AWS CLI は、コマンドラインシェルでコマンドを使用して AWS サービスとやり取りするためのオープンソースツールです。このセクションの手順を完了するには、以下が必要です。
ツールとライブラリ
Lambda は、Go ランタイム用の次のツールとライブラリを提供します。
Go 用のツールとライブラリ
-
AWS SDK for Go
: Go プログラミング言語用の公式の AWS SDK。 -
github.com/aws/aws-lambda-go/lambda
: Go 用の Lambda プログラミングモデルの実装。このパッケージは、ハンドラーを呼び出すために AWS Lambda で使用されます。 -
github.com/aws/aws-lambda-go/lambdacontext
: コンテキストオブジェクトからコンテキスト情報にアクセスするためのヘルパー。 -
github.com/aws/aws-lambda-go/events
: このライブラリは一般的なイベントソース統合のタイプの定義を提供します。 -
github.com/aws/aws-lambda-go/cmd/build-lambda-zip
: このツールは、Windows で .zip ファイルアーカイブを作成するために使用することができます。
詳細については、GitHub の「aws-lambda-go
サンプルアプリケーション
Lambda は、Go ランタイム用の次のサンプルアプリケーションを提供します。
Go のサンプル Lambda アプリケーション
-
blank-go
- Lambda の の Go ライブラリ、ログ記録、環境変数、AWS SDK の使用を示す Go 関数。
macOS および Linux での .zip ファイルの作成
次の手順は、go get
を使用して GitHub から lambda
-
GitHub から lambda ライブラリをダウンロードします。
go get github.com/aws/aws-lambda-go/lambda
-
実行可能ファイルをコンパイルします。
GOOS=linux GOARCH=amd64 go build -o main main.go
GOOS
をlinux
に設定すると、非 Linux 環境でコンパイルする場合でも、コンパイルされた実行可能ファイルと Go ランタイムとの互換性を確保できます。 -
(オプション)
main
パッケージが複数のファイルで構成されている場合は、次の go buildコマンドを使用してパッケージをコンパイルします。 GOOS=linux GOARCH=amd64 go build main
-
(オプション) Linux では、
CGO_ENABLED=0
set を使用してパッケージをコンパイルする必要がある場合があります。GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o main main.go
このコマンドは、標準の C ライブラリ (
libc
) バージョン用の安定したバイナリパッケージを作成します。このパッケージは、Lambda と他のデバイスでは異なる場合があります。 -
Lambda は POSIX ファイルアクセス許可を使用するため、.zip ファイルを作成する前に、デプロイパッケージフォルダのアクセス許可を設定する
必要がある場合があります。 -
実行可能ファイルを .zip ファイルにパッケージ化して、デプロイパッケージを作成します。
zip main.zip main
Windows での .zip ファイルの作成
以下のステップでは、go get
を使用して GitHub から lambdago install
を使用して GitHub から Windows 用の build-lambda-zip
上記を実行していない場合には、gitgit
環境変数に %PATH%
の実行可能ファイルを追加します。
-
GitHub から lambda ライブラリをダウンロードします。
go get github.com/aws/aws-lambda-go/lambda
-
GitHub から build-lambda-zip ツールをダウンロードします。
go.exe install github.com/aws/aws-lambda-go/cmd/build-lambda-zip@latest
-
GOPATH
のツールを使用して、.zip ファイルを作成します。Go のデフォルトのインストールがある場合、このツールは通常%USERPROFILE%\Go\bin
に置かれています。それ以外の場合は、Go ランタイムをインストールした場所に移動し、次のいずれかの操作を行います。
.zip アーカイブを使用した Lambda 関数の作成
Lambda 関数を作成するには、作成した main.zip
デプロイパッケージに加えて、実行ロールも必要になります。実行ロールは、ログストリーミングのための Amazon CloudWatch Logs などの AWS サービスと、リクエストトレーシングのための AWS X-Ray を使用する許可を関数に付与します。関数用の実行ロールは、IAM コンソール、または AWS Command Line Interface (AWS CLI) を使用して作成できます。
以下のステップでは、AWS CLI を使用して実行ロールを作成してから、.zip デプロイパッケージを使用して Lambda 関数を作成する方法を説明します。
-
実行ロールを引き受ける許可を Lambda サービスに付与する信頼ポリシーを作成します。以下の JSON をコピーして、現在のディレクトリに
trust-policy.json
という名前のファイルを作成します。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
-
実行ロールを作成する
aws iam create-role --role-name lambda-ex --assume-role-policy-document file://trust-policy.json
次のような出力が表示されます。ロールの ARN をメモします。これは、関数を作成するときに必要になります。
{ "Role": { "Path": "/", "RoleName": "lambda-ex", "RoleId": "AROAQFOXMPL6TZ6ITKWND", "Arn": "arn:aws:iam::123456789012:role/lambda-ex", "CreateDate": "2020-01-17T23:19:12Z", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } } }
-
attach-role-policy
コマンドを使用して、ロールに許可を追加します。以下の例では、Lambda 関数が CloudWatch にログをアップロードできるようにするAWSLambdaBasicExecutionRole
マネージドポリシーを追加します。Lambda 関数が Amazon S3 や DynamoDB などの他の AWS サービスとやり取りする場合は、Lambda 関数がこれらのサービスにアクセスできるようにするポリシーを追加する必要があります。詳細については、「Lambda 機能の AWS マネージドポリシー」を参照してください。aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
-
関数を作成します。
aws lambda create-function --function-name
my-function
--runtime go1.x --rolearn:aws:iam::123456789012:role/lambda-ex
--handler main --zip-file fileb://main.zip
AWS CLI を使用して Go Lambda 関数を作成するときは、ユーザーが定義するハンドラー設定の値が実行可能ファイルの名前になります。詳細については、「Go の AWS Lambda 関数ハンドラー」を参照してください。
提供される.al2 ランタイムを使用して Go をビルドする
Go は、他のネイティブランタイムとは異なる方法で実装されています。Lambda では Go がカスタムランタイムとして扱われるので、提供された .al2 ランタイム上に Go 関数を作成することが可能です。AWS SAM のビルドコマンドにより、.zip ファイルパッケージをビルドできます。
AL2 関数用に Go をビルドするための AWS SAM の使用
提供された .al2 ランタイムを使用するように AWS SAM テンプレートを更新します。また、makefile に BuildMethod を設定します。
Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: hello-world/ Handler: my.bootstrap.file Runtime: provided.al2 Architectures: [arm64] Metadata: BuildMethod: makefile
x86_64 命令セットアーキテクチャ用のパッケージを構築するために、
Architectures
プロパティを削除します。以下の内容の makefile ファイルを、プロジェクトフォルダーに追加します。
GOOS=linux go build -o bootstrap cp ./bootstrap $(ARTIFACTS_DIR)/.
アプリケーションのサンプルは、Go on AL2