【问题标题】:How to Configure CloudWatch Lambda Insights in Terraform如何在 Terraform 中配置 CloudWatch Lambda Insights
【发布时间】:2021-04-20 11:16:26
【问题描述】:

我需要使用 Terraform 为 lambda 启用“CloudWatch Lambda Insights”,但找不到文档。如何在 Terraform 中做到这一点?

注意:这个问题How to add CloudWatch Lambda Insights to serverless config? 可能是相关的。

【问题讨论】:

    标签: amazon-web-services aws-lambda terraform amazon-cloudwatch


    【解决方案1】:

    AWS Terraform 提供程序的 aws_lambda_function 资源中没有“布尔开关”,您可以将其设置为 true,这将启用 Cloudwatch Lambda Insights。

    幸运的是,您可以自己完成此操作。以下 Terraform 定义基于此 AWS 文档:Using the AWS CLI to enable Lambda Insights on an existing Lambda function

    这个过程包括两个步骤:

    1. 为您的 Lambda 添加一个
    2. 将 AWS 策略附加到您的 Lambdas 角色。

    Terraform 定义如下所示:

    resource "aws_lambda_function" "insights_example" {
      [...]
    
      layers = [
        "arn:aws:lambda:us-east-1:580247275435:layer:LambdaInsightsExtension:14"
      ]
    }
    
    resource "aws_iam_role_policy_attachment" "insights_policy" {
      role       = aws_iam_role.insights_example.id
      policy_arn = "arn:aws:iam::aws:policy/CloudWatchLambdaInsightsExecutionRolePolicy"
    }
    

    重要提示:层的arn对于每个区域都是不同的。我在上面链接的文档有一个link 到它们的列表。此外,如果您的 Lambda 在 VPC 中,则需要一个额外的步骤,您可以在文档中阅读。描述的“VPC 步骤”也可以放入 Terraform。


    对于未来的读者:在我的示例中该层的版本是14。这会随着时间而改变。所以请不要只是复制和粘贴该部分。按照提供的链接查找该层的当前版本。


    最小、完整和可验证的示例

    测试:

    Terraform v0.14.4
    + provider registry.terraform.io/hashicorp/archive v2.0.0
    + provider registry.terraform.io/hashicorp/aws v3.24.0
    

    在一个文件夹中创建以下两个文件(handler.pymain.tf)。然后运行以下命令:

    1. terraform init
    2. terraform plan
    3. terraform apply

    除了部署所需的资源外,它还将创建一个包含handler.py 的zip 存档,这是aws_lambda_function 资源使用的部署工件。所以这是一个一体化的例子,不需要进一步压缩等。

    handler.py

    def lambda_handler(event, context):
        return { 
            'message' : 'CloudWatch Lambda Insights Example'
        }
    

    ma​​in.tf

    terraform {
      required_providers {
        aws = {
          source  = "hashicorp/aws"
          version = "~> 3.0"
        }
      }
    }
    
    provider "aws" {
      region = "us-east-1"
    }
    
    resource "aws_lambda_function" "insights_example" {
      function_name = "insights-example"
      runtime       = "python3.8"
      handler       = "handler.lambda_handler"
      role          = aws_iam_role.insights_example.arn
      filename      = "${path.module}/lambda.zip"
    
      layers = [
        "arn:aws:lambda:us-east-1:580247275435:layer:LambdaInsightsExtension:14"
      ]
    
      depends_on = [
        data.archive_file.insights_example
      ]
    }
    
    resource "aws_iam_role" "insights_example" {
      name               = "InsightsExampleLambdaRole"
      assume_role_policy = data.aws_iam_policy_document.lambda_assume.json
    }
    
    resource "aws_iam_role_policy_attachment" "insights_example" {
      role       = aws_iam_role.insights_example.id
      policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
    }
    
    resource "aws_iam_role_policy_attachment" "insights_policy" {
      role       = aws_iam_role.insights_example.id
      policy_arn = "arn:aws:iam::aws:policy/CloudWatchLambdaInsightsExecutionRolePolicy"
    }
    
    data "aws_iam_policy_document" "lambda_assume" {
      statement {
        effect  = "Allow"
        actions = ["sts:AssumeRole"]
    
        principals {
          type        = "Service"
          identifiers = ["lambda.amazonaws.com"]
        }
      }
    }
    
    data "archive_file" "insights_example" {
      type        = "zip"
      source_file = "${path.module}/handler.py"
      output_path = "${path.module}/lambda.zip"
    }
    

    【讨论】:

    • 你可以用aws_lambda_layer_version data source替换层的ARN的硬编码。
    • @ydaetskcoR 我检查了文档,但我不知道这是否可能。虽然,文档很薄。但是版本数据源不允许指定要使用的arn 等。它似乎只对具有相同名称的resource 有意义。但这需要 you 提供层。据我所知,您不能从现有的 arn 创建 aws_lambda_layer_version 数据源。你能举个例子吗?
    • 我实际上并没有使用过它,但我希望你会用 layer_name = LambdaInsightsExtension 调用它,然后可能还会设置 compatible_runtime = "python3.8" 以匹配 Lambda 函数的运行时。如果你没有设置compatible_runtime,那么最终你可能会得到最新的LambdaInsightsExtension 层,在未来某个时候不再支持python3.8 运行时。不过,我可能会将其提取到本地或变量中,并在两个地方都使用它。
    • @ydaetskcoR 如果只是将LambdaInsightsExtension设置为layer_name,那么region和account id的信息是从哪里来的呢?我用上面的例子尝试了一些东西,但没有让它工作。我永远无法指出那个具体的arn
    • 啊,是的,我刚刚尝试使用 AWS CLI 列出它,但它没有返回任何内容,即使您可以使用 aws lambda get-layer-version-by-arn --arn arn:aws:lambda:us-east-2:580247275435:layer:LambdaInsightsExtension:14 --region us-east-2 看到它。不幸的是,API 似乎也不接受任何获取帐户 ID 的方式,因此目前没有这样做的方法。看来我错了,对不起:/
    【解决方案2】:

    如果您使用 container images 作为 Lambda 函数的 deployment package,启用 CloudWatch Lambda Insights 所需的步骤略有不同(因为此处不能使用 Lambda 层):

    1. 按照 Jens 的描述将 arn:aws:iam::aws:policy/CloudWatchLambdaInsightsExecutionRolePolicy 附加到您的职能角色
    2. 将 Lambda Insights 扩展添加到您的容器映像中
    FROM public.ecr.aws/lambda/nodejs:12
    
    RUN curl -O https://lambda-insights-extension.s3-ap-northeast-1.amazonaws.com/amazon_linux/lambda-insights-extension.rpm && \
        rpm -U lambda-insights-extension.rpm && \
        rm -f lambda-insights-extension.rpm
    
    COPY app.js /var/task/
    

    详情请见documentation

    【讨论】:

      猜你喜欢
      • 2021-03-20
      • 2016-11-19
      • 2021-10-30
      • 2021-07-16
      • 2023-03-06
      • 1970-01-01
      • 2020-04-10
      • 2021-06-15
      • 1970-01-01
      相关资源
      最近更新 更多