💪

AWS Lambda の arm64 アーキテクチャで Go を実行する際に Datadog を導入する方法

2024/04/15に公開

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 アーキテクチャを採用したいです。
https://aws.amazon.com/jp/lambda/pricing/

Go Lambda 関数のデプロイ方法

Lambda の Go 1.x マネージドランタイムは非奨励になったため、現在推奨される Go Lambda 関数のデプロイ方法は主に以下の2つになります。

  1. コンテナイメージをデプロイする方法
  2. .zip ファイルアーカイブをデプロイする方法

個人的には、Dockerfile と ECR で簡単にバージョン管理ができるので、コンテナイメージをデプロイする方が楽な気がします。
今回も、1の方法でデプロイを進めていましたが、Datadog を導入する際に1の方法ではできず、詰まったので共有したいと思います。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-golang.html

Datadogの導入方法

現在、Datadog を用いて Lambda 関数を監視するには、Datadog Lambda Extension を用いることが推奨されています。

2つのやり方

Datadog Lambda Extension を Go で実装された Lambda 関数に導入する方法は2つあります。
詳細はこちらを参照してください。

  1. デプロイする Go のコンテナイメージに Datadog Lambda Extension をインストールする
  2. Go の .zip ファイルアーカイブのデプロイ時に Datadog Lambda Extension の Lambda Layer を追加する

1つ目の方が簡便で、Lambda 関数を構成する Dockerfile に

COPY --from=public.ecr.aws/datadog/lambda-extension:<TAG> /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 を追加する必要がありました。

参考

GENDA

Discussion