从 Terraform cdk deploy lambda 获取属性

Posted

技术标签:

【中文标题】从 Terraform cdk deploy lambda 获取属性【英文标题】:Getting attribute from Terrafrom cdk deployed lambda 【发布时间】:2022-01-15 06:45:03 【问题描述】:

我正在使用 Terraform CDK 部署 lambda 函数,并尝试使用 s3 通知为其设置触发器。我对 CDK 有点陌生,所以我不确定这里可能出了什么问题。

阅读此example 并基于使用常规 CDK 所做的工作,我认为要访问函数 arn(以便将其添加到存储桶通知设置),它应该是 my_function.arn,但它呈现以下细绳 TfToken[TOKEN.XXX].

在我看来,我可以用这个值在某个地方获取 arn,但我找不到在哪里。

我想把它分成两个堆栈,但我需要将 lambda 及其通知触发器部署在一起。

代码是

#!/usr/bin/env python
from constructs import Construct
from cdktf import App, TerraformStack, TerraformOutput
from imports.aws import AwsProvider
from imports.aws.lambdafunction import LambdaFunction
from imports.aws.s3 import S3BucketNotification, S3BucketNotificationLambdaFunction
import os

class My_Stack(TerraformStack):
  def __init__(self, scope: Construct, ns: str):
    super().__init__(scope, ns)

    AwsProvider(self, 'Aws', region='my-region')

    my_lambda_function = LambdaFunction(
      self, id='id',
      function_name='cdk-deployment-test',
      role='my-role',
      memory_size=128,
      runtime='python3.8',
      timeout=900,
      handler="lambda_handler",
      filename=os.path.join(os.getcwd(), 'deployment_package/package.zip')
    )

    function_to_be_triggered = S3BucketNotificationLambdaFunction(
      lambda_function_arn= my_lambda_function.arn,
      events = ["s3:ObjectCreate:*"],
      filter_prefix = "path"
    )

    payment_recognition_input = S3BucketNotification(
      self, id='s3-bucket-notification',
      bucket = 'my-bucket',
      lambda_function=[function_to_be_triggered]
    )

app = App()
My_Stack(app, "cdktf-poc")

app.synth()

【问题讨论】:

为什么要混合和匹配部署服务?使用 CDK 或 terraform,但 imo 使用这两种方法会使事情变得过于复杂。 我不是在混音。我只使用 Terraform cdk 来完成任务 【参考方案1】:

这是引用 terraform 资源的 ARN 属性的正确方法,TfToken[TOKEN.XXX] 标记解析为合成器输出中的 Terraform 语言语法。在此处查看讨论令牌的 CDK For Terraform 文档:

https://github.com/hashicorp/terraform-cdk/blob/main/docs/working-with-cdk-for-terraform/tokens.md#tokens

例如,这个 CDKTF 代码:

const vpc = new Vpc(this, "my-vpc", 
  name: vpcName,
);

new Eks(this, "EksModule", 
  clusterName: "my-kubernetes-cluster",
  vpcId: vpc.vpcIdOutput,
);

最终生成(使用令牌)这个 terraform:


  "module": 
    "helloterraEksModule5DDB67AE": 
      "cluster_name": "my-kubernetes-cluster",
      "vpc_id": "$module.helloterraMyVpc62D94C17.vpc_id"
    
  

因此,在 Terraform 计划/应用时,该引用和依赖链接仍然存在。

对于您的特定用例,已尝试以下方法,使用预构建的 aws 提供程序和 S3BucketNotificationLambdaFunction 来构建 lambda 函数配置:

from cdktf_cdktf_provider_aws.s3 import S3BucketNotificationLambdaFunction, S3BucketNotification
from cdktf_cdktf_provider_aws.lambda_function import LambdaFunction

my_lambda_function = LambdaFunction(
    self, id='id',
    function_name='cdk-deployment-test',
    role='my-role',
    memory_size=128,
    runtime='python3.8',
    timeout=900,
    handler="lambda_handler",
    filename=os.path.join(os.getcwd(), 'deployment_package/package.zip')
)

S3BucketNotification(
    self,
    id="s3-bucket-notification",
    bucket="my-bucket",
    lambda_function=[
        S3BucketNotificationLambdaFunction(
            lambda_function_arn=my_lambda_function.arn,
            events=["s3:ObjectCreate"],
            filter_prefix="path"
        )
    ]
)

【讨论】:

感谢文档。如果我做对了,这应该可以正常工作吗?我收到错误Error: error putting S3 Bucket Notification Configuration: InvalidArgument: The ARN is not well formed。我使用了 cdktf 计划并阅读了 .json 文件,似乎我在这里遗漏了一些配置,即使我从 terraform 遵循这个示例 registry.terraform.io/providers/hashicorp/aws/latest/docs/…。规范似乎遵循 Lambda 部署中看到的相同模式 是的,您的代码应该可以工作 - 我自己通过 2 个小调整对其进行了测试 - 我正在使用预构建的 aws 提供程序,还有 S3BucketNotificationLambdaFunction - 将用这些更新我的答案跨度> 谢谢!我没有注意到我需要这个人。我没有设法让它与ObjectCreate 一起工作,而不是与ObjectCreated 一起工作,它现在与Error: error putting S3 Bucket Notification Configuration: InvalidArgument: Unable to validate the following destination configurations 一起失败,但我必须向s3 授予权限才能调用该函数。

以上是关于从 Terraform cdk deploy lambda 获取属性的主要内容,如果未能解决你的问题,请参考以下文章

aws cdk 可以提供远程状态吗?

在 CloudFormation/CDK 中获取 Sagemaker Notebook 实例 IP 地址

使用 terraform 获取和更新特定字段

App Deploy as Code! SAE & Terraform 实现 IaC 式部署应用

如果在 Terraform 模块中创建了 aws_api_gateway_integration,如何在 aws_api_gateway_deployment 资源上填充depends_on?

使用来自 GCP 市场的 terraform 创建实例