gpt4 book ai didi

amazon-web-services - 如何用CDK获取资源的逻辑ID?

转载 作者:行者123 更新时间:2023-12-03 16:43:50 28 4
gpt4 key购买 nike

我正在尝试写一些tests用于验证作为构造的一部分定义的安全组规则的 CDK 构造。

构造如下所示。

export interface SampleConstructProps extends StackProps {
srcSecurityGroupId: string;
}

export class SampleConstruct extends Construct {
securityGroup: SecurityGroup;

constructor(scope: Construct, id: string, props: SampleConstructProps) {
super(scope, id, props);

// const vpc = Vpc.fromLookup(...);
this.securityGroup = new SecurityGroup(this, "SecurityGroup", {
vpc: vpc,
allowAllOutbound: true,
});

const srcSecurityGroupId = SecurityGroup.fromSecurityGroupId(stack, "SrcSecurityGroup", props.srcSecurityGroupId);

this.securityGroup.addIngressRule(srcSecurityGroup, Port.tcp(22));
}
}

我想编写一个如下所示的测试。

test("Security group config is correct", () => {
const stack = new Stack();
const srcSecurityGroupId = "id-123";
const testConstruct = new SampleConstruct(stack, "TestConstruct", {
srcSecurityGroupId: srcSecurityGroupId
});

expect(stack).to(
haveResource(
"AWS::EC2::SecurityGroupIngress",
{
IpProtocol: "tcp",
FromPort: 22,
ToPort: 22,
SourceSecurityGroupId: srcSecurityGroupId,
GroupId: {
"Fn::GetAtt": [testConstruct.securityGroup.logicalId, "GroupId"], // Can't do this
},
},
undefined,
true
)
);
});

这里的问题是测试是根据合成的 CloudFormation 模板进行验证的,因此如果您想验证由此构造创建的安全组是否具有允许从 srcSecurityGroup 进行访问的规则,您需要Logical ID作为构造的一部分创建的安全组。

您可以在此处生成的 CloudFormation 模板中看到这一点。

{
"Type": "AWS::EC2::SecurityGroupIngress",
"Properties": {
"IpProtocol": "tcp",
"FromPort": 22,
"GroupId": {
"Fn::GetAtt": [
"TestConstructSecurityGroup95EF3F0F", <-- This
"GroupId"
]
},
"SourceSecurityGroupId": "id-123",
"ToPort": 22
}
}

Fn::GetAtt 是这个问题的关键。由于这些测试实际上只是进行对象比较,因此您需要能够复制 Fn::Get 调用,这需要 CloudFormation 逻辑 ID。


请注意,CDK确实提供 handful of identifiers为你。

  • 唯一 ID 提供了非常接近的东西,但它与 CloudFormation 堆栈中使用的标识符不同。例如,securityGroup.uniqueId 返回 TestStackTestConstructSecurityGroup10D493A7,而 CloudFormation 模板显示 TestConstructSecurityGroup95EF3F0F。您可以注意到差异在于 uniqueId 将构造 ID 前置到逻辑标识符,并且附加的哈希值各不相同。
  • 构造 ID 只是您在实例化构造时提供的标识符。它也不是逻辑 ID,尽管它被用作逻辑 ID 的一部分。我还没有看到一种以编程方式直接从构造中检索此 ID 的方法。当然,您可以在某处定义ID并重复使用它,但这仍然不能解决它与逻辑ID不完全匹配的问题。在本例中,合成模板中的构造 ID 为 SecurityGroup,逻辑 ID 为 TestConstructSecurityGroup95EF3F0F,两者之间存在差异。

有没有一种直接的方法来获取CDK资源的逻辑ID?

最佳答案

写完整篇文章并深入研究 CDK 代码后,我偶然发现了我正在寻找的答案。如果有人有更好的方法从更高级别的 CDK 构造中获取逻辑 ID,我们将不胜感激。

如果您需要获取 CDK 资源的逻辑 ID,您可以执行以下操作:

const stack = new Stack();
const construct = new SampleConstruct(stack, "SampleConstruct");
const logicalId = stack.getLogicalId(construct.securityGroup.node.defaultChild as CfnSecurityGroup);

请注意,您已经拥有 CloudFormation 资源(例如以 Cfn 开头的资源),那么这就更容易了。

// Pretend construct.securityGroup is of type CfnSecurityGroup
const logicalId = stack.getLogicalId(construct.securityGroup);

关于amazon-web-services - 如何用CDK获取资源的逻辑ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61803090/

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