从 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 获取属性的主要内容,如果未能解决你的问题,请参考以下文章
在 CloudFormation/CDK 中获取 Sagemaker Notebook 实例 IP 地址
App Deploy as Code! SAE & Terraform 实现 IaC 式部署应用
如果在 Terraform 模块中创建了 aws_api_gateway_integration,如何在 aws_api_gateway_deployment 资源上填充depends_on?