AWS Lambda の arm64 アーキテクチャで Go を実行する際に Datadog を導入する方法
TL;DR
- AWS Lambda で Go の関数を実行する際に Datadog Lambda Extension を用いて監視データを収集する方法は、コンテナイメージに Datadog Lambda Extension をインストールする方法か、Datadog Lambda Extension の Lambda Layer を追加する方法の2つがあります。
- arm64 アーキテクチャ上の Go 関数を Datadog で監視するためには、 Datadog Lambda Extension の Lambda Layer を追加する方法しか取れないため、.zip ファイルアーカイブを使用して Go の Lambda 関数をデプロイする必要がありました。
なぜ arm64 アーキテクチャか
arm64 の方が高速かつ廉価であるため、特に制限がなければ arm64 アーキテクチャを採用したいです。
Go Lambda 関数のデプロイ方法
Lambda の Go 1.x マネージドランタイムは非奨励になったため、現在推奨される Go Lambda 関数のデプロイ方法は主に以下の2つになります。
- コンテナイメージをデプロイする方法
- .zip ファイルアーカイブをデプロイする方法
個人的には、Dockerfile と ECR で簡単にバージョン管理ができるので、コンテナイメージをデプロイする方が楽な気がします。
今回も、1の方法でデプロイを進めていましたが、Datadog を導入する際に1の方法ではできず、詰まったので共有したいと思います。
Datadogの導入方法
現在、Datadog を用いて Lambda 関数を監視するには、Datadog Lambda Extension を用いることが推奨されています。
2つのやり方
Datadog Lambda Extension を Go で実装された Lambda 関数に導入する方法は2つあります。
詳細はこちらを参照してください。
- デプロイする Go のコンテナイメージに Datadog Lambda Extension をインストールする
- Go の .zip ファイルアーカイブのデプロイ時に Datadog Lambda Extension の Lambda Layer を追加する
1つ目の方が簡便で、Lambda 関数を構成する Dockerfile に
COPY /opt/. /opt/
の行を追加すれば良いだけです。<TAG>
は任意のバーションに設定可能です。
しかし、arm64 アーキテクチャ上で Datadog Lambda Extension を動かしたい場合、2024年4月現在、この方法を採用することはできませんでした。
理由は、Datadog Lambda Extension の ECR Public Repositoryに、arm64 アーキテクチャに対応するイメージが公開されていないからです。
したがって、コンテナイメージに arm64 に対応した Datadog Lambda Extension をインストールすることができませんでした。
実際の実装
2つ目の方法で実装することで、arm64 アーキテクチャ上の Lambda 関数を監視することができました。
まず、こちらを参考に、実装した Go 関数をデプロイ用の .zip ファイルにまとめます。
次に、作成した .zip ファイルアーカイブを S3 にアップロードします。
Datadog Lambda Extension の Lambda Layer を追加して S3 上の .zip ファイルアーカイブをデプロイします。今回は Go を用いた CDK でデプロイを行いました。Lambda 関数を定義する部分の CDK のコードは以下のようになります。
package main
import "github.com/aws/aws-cdk-go/awscdk/v2/awslambda"
...
lambdaFunc := awslambda.NewFunction(
stack,
jsii.String("LambdaFunction"),
&lambda.FunctionProps{
FunctionName: jsii.String("test-function"),
Code: awslambda.Code_FromBucket("test-bucket", jsii.String("test.zip"), nil),
Runtime: awslambda.Runtime_PROVIDED_AL2023(),
Handler: jsii.String("bootstrap"),
Architecture: awslambda.Architecture_ARM_64(),
Environment: &map[string]*string{
"DD_SITE": jsii.String("datadoghq.com"),
"DD_API_KEY_SECRET_ARN": "secret-arn",
},
Layers: &[]awslambda.ILayerVersion{
lambda.LayerVersion_FromLayerVersionArn(
stack,
jsii.String("LambdaLayerDatadog"),
jsii.String(arn:aws:lambda:<AWS_REGION>:464622532012:layer:Datadog-Extension-ARM:56),
),
},
},
)
ポイントは Lambda Layerを追加している以下の部分です。ここで、arm64 に対応した Datadog Lambda Extension を指定します。
Layers: &[]lambda.ILayerVersion{
lambda.LayerVersion_FromLayerVersionArn(
stack,
jsii.String("LambdaLayerDatadog"),
jsii.String(arn:aws:lambda:<AWS_REGION>:464622532012:layer:Datadog-Extension-ARM:56),
),
},
また、.zip ファイルアーカイブをデプロイする際には、Handler名をbootstrap
とする必要があるようです。
Handler: jsii.String("bootstrap"),
詳細はこちらを参照してください。
まとめ
arm64 アーキテクチャー上の Go Lambda 関数を Datadog で監視するための 2024年4月現在の方法は、Go Lambda 関数を .zip ファイルアーカイブにパッケージ化し、デプロイ時に Datadog Lambda Extension の Lambda Layer を追加する必要がありました。
参考
- AWS Lambda の arm64 について
- Datadog Lambda Extensionについて
- AWS Lambda を .zip ファイルアーカイブを用いてデプロイする
Discussion