从 Terraform cdk deploy lambda 获取属性

Getting attribute from Terrafrom cdk deployed lambda

我正在使用 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()

这是引用 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,
});

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

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

因此该引用和依赖项 link 在 Terraform plan/apply 时仍然存在。

对于您的特定用例,已尝试以下方法,使用预构建的 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"
        )
    ]
)