gpt4 book ai didi

amazon-web-services - 获取 AWS Cdk 中生成的名称

转载 作者:行者123 更新时间:2023-12-03 07:28:55 32 4
gpt4 key购买 nike

当在 CDK 中创建 WebAcl 并让 CDK 生成名称时,我想使用生成的名称作为 CDK 中的变量,即在像这样生成 WebAcl 时(在属性中没有设置显式名称)...

const webAcl = new CfnWebACL(this, "webAcl", {
defaultAction: {
allow: {},
},
scope: myScope,
visibilityConfig: {
cloudWatchMetricsEnabled: true,
metricName: "webACL",
sampledRequestsEnabled: true,
}
});

...部署后,webAcl 将生成一个类似于 webAcl-7xtQ0oTU473X 的名称(带有附加哈希值的 ID)。问题是我不知道如何在 CDK 中引用这个名称作为变量。

我发现以下可能性可以获取某种类型的 ID/名称,但在部署后它们都没有解析为 webAcl-7xtQ0oTU473X(但是,有些包含我想要的值):

webAcl.name // is undefined in CDK
webAcl.logicalId // resolves to 'webAcl' (no hash)
webAcl.attrId // resolves to the id
webAcl.attrLabelNamespace // resolves to 'awswaf:<accountNumber>:webacl:webACL-7xtQ0oTU473X:'
webAcl.attrArn // resolves to the full Arn
Names.uniqueId(webAcl) // resolves to '<stackName><nestedStackName>webACL<someOtherHash>'

还有其他方法可以获取所需的变量值吗?

最佳答案

L1 构造的属性

L1 constructs are exactly the resources defined by AWS CloudFormation—no more, no less. You must provide the resource's required configurationyourself.

From the Developer Guide

该库没有为我们定义任何值,而仅使用我们提供的值。因此,例如,如果我们没有为 Name 设置任何值,那么合成模板中就没有值。

下面是来自合成模板的资源定义。

Resources:
webAcl:
Type: AWS::WAFv2::WebACL
Properties:
DefaultAction:
Allow: {}
Scope: my-scope
VisibilityConfig:
CloudWatchMetricsEnabled: true
MetricName: webACL
SampledRequestsEnabled: true

资源定义没有Name 属性。 CloudFormation 在部署模板时生成该属性。

无法访问我们尚未设置的属性。好吧,没有黑客。

L1 构造的返回值

在CloudFormation模板中,我们可以使用资源的返回值。请在 CloudFormation user guide 中查找列表对于 WebACL。每个资源都有此部分。

我们可以访问 CDK 脚本中的值 tokens .

  console.log({
ref: webAcl.ref,
attrArn: webAcl.attrArn,
attrCapacity: webAcl.attrCapacity,
attrId: webAcl.attrId,
attrLabelNamespace: webAcl.attrLabelNamespace
})

enter image description here

这些是 CloudFormation 在部署期间生成的唯一值,我们可以在脚本中访问这些值。 CDK 库将它们很好地映射到合成模板中的 CloudFormation GetAttRef 函数调用。

例如,我们通过 webAcl.attrCapacity 获取此值。我不知道为什么它在控制台日志中看起来很奇怪。

        Fn::GetAtt:
- webAcl
- Capacity

也许是一个解决方法

我们可以使用intrinsic functions从资源的值(value)中提取我们的值(value)。

Fn.select(3, Fn.split(':', webAcl.attrLabelNamespace))

在合成的模板中,我们得到了函数调用链。

        Fn::Select:
- 3
- Fn::Split:
- ":"
- Fn::GetAtt:
- webAcl
- LabelNamespace

这对我来说看起来很脆弱,但它可能有用。请记住,您不能对此值应用任何 JavaScript 操作,而只能将其用作构造属性。因为CDK用模板中的函数调用来替代它。

引用代码

我使用以下代码来测试答案。

import { App, Fn, Stack } from 'aws-cdk-lib'
import { env } from 'process'
import { CfnBucket } from 'aws-cdk-lib/aws-s3'
import { CfnWebACL } from 'aws-cdk-lib/aws-wafv2'

function createStack (scope, id, props) {
const stack = new Stack(scope, id, props)

const webAcl = new CfnWebACL(stack, 'webAcl', {
defaultAction: {
allow: {},
},
scope: 'my-scope',
visibilityConfig: {
cloudWatchMetricsEnabled: true,
metricName: 'webACL',
sampledRequestsEnabled: true,
}
})

new CfnBucket(stack, 'bucket', {
bucketName: Fn.select(3, Fn.split(':', webAcl.attrLabelNamespace))
})

console.log({
ref: webAcl.ref,
attrArn: webAcl.attrArn,
attrCapacity: webAcl.attrCapacity,
attrId: webAcl.attrId,
attrLabelNamespace: webAcl.attrLabelNamespace
})

return stack
}

const app = new App()
createStack(app, 'WebAclName', {
env: { account: env.CDK_DEFAULT_ACCOUNT, region: env.CDK_DEFAULT_REGION }
})

关于amazon-web-services - 获取 AWS Cdk 中生成的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73419118/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com