我想在创建模板时引用另一个 AWS CloudFormation 堆栈中的资源。
简短描述
以下解决方法列举了一个创建跨堆栈引用的方法。有关更多说明,请参阅演练:引用另一个 AWS CloudFormation 堆栈中的资源输出。
**注意:**要引用另一个 AWS CloudFormation 堆栈中的资源,您必须先创建跨堆栈引用。要创建跨堆栈引用,请使用导出字段标记要导出的资源输出的值。然后,使用 Fn::ImportValue 内部函数导入同一 AWS 区域和账户内任一堆栈中的值。AWS CloudFormation 通过模板中指定的名称来标识导出值。这些名称必须是您的 AWS 区域和账户中的唯一名称。
解决方法
以下为创建名为 NetworkStack 的 AWS CloudFormation 堆栈的步骤。此堆栈会创建与网络相关的资源,以及名为 ${AWS::StackName}-SecurityGroupID 和 ${AWS::StackName}-SubnetID 的导出。堆栈创建之后,${AWS::StackName} 会被替换为 NetworkStack。最终的导出名称为 NetworkStack-SecurityGroupID 和 NetworkStack-SubnetID。
创建堆栈以导出输出值
1. 使用此模板来创建 AWS CloudFormation 堆栈。
2. 将此堆栈命名为 NetworkStack。
**注意:**NetworkStack 会导出子网和安全组值。
使用导入的子网和安全组创建 Amazon Elastic Compute Cloud (Amazon EC2) 实例
1. 打开 AWS CloudFormation 控制台。
2. 选择创建堆栈,然后选择设计模板。
3. 在代码编辑器中的参数选项卡中,选择模板。
4. 复制以下模板并将其粘贴到代码编辑器,然后,使用 InstanceType 和 ImageId 的相应值更新模板:
{
"Parameters": {
"NetworkStackParameter": {
"Type": "String"
}
},
"Resources": {
"WebServerInstance": {
"Type": "AWS::EC2::Instance",
"Properties": {
"InstanceType": "t2.micro",
"ImageId": "ami-a1b23456",
"NetworkInterfaces": [
{
"GroupSet": [
{
"Fn::ImportValue": {
"Fn::Sub": "${NetworkStackParameter}-SecurityGroupID"
}
}
],
"AssociatePublicIpAddress": "true",
"DeviceIndex": "0",
"DeleteOnTermination": "true",
"SubnetId": {
"Fn::ImportValue": {
"Fn::Sub": "${NetworkStackParameter}-SubnetID"
}
}
}
]
}
}
}
}
**重要提示:**在第 4 步中的模板中,将 NetworkStack 资源堆栈用作 NetworkStackParameter 的值。NetworkStack 值会替换相应 Fn::ImportValue 函数中的相应堆栈名称。
**注意:**有关导入和导出模板的示例,请参阅 Fn::ImportValue。
5. 选择创建堆栈图标,然后选择下一步。
6. 在堆栈名称部分输入您的堆栈名称。
7. 在 Parameters(参数)部分输入您想交叉引用的网络堆栈名称 (NetworkStack)。
8. 选择下一步,继续选择下一步,然后选择创建。
9. 堆栈创建完之后,请打开 Amazon EC2 控制台。
10. 在导航窗格中,选择实例,然后选择使用第 4 步中的模板创建的实例。
11. 选择描述视图,然后确认安全组和子网是否已配置。
**重要提示:**当另一个堆栈导入导出值时,您无法删除源堆栈或源堆栈的导出值。要更新源堆栈的导出值,请首先手动替换正在导入源堆栈导出值的堆栈中的实际值。然后,您可以更新源堆栈的导出值。
要列出正在导入已导出的输出值的所有堆栈,请运行 list-imports 命令。要列出 AWS 区域中的所有导出,请使用 AWS CloudFormation 控制台或运行 list-exports 命令。每个 AWS 区域的账户的导出名称必须是唯一的。
相关信息
如何使用 AWS Systems Manager Parameter Store 中的参数在 CloudFormation 堆栈之间共享值?
AWS CloudFormation 模板
AWS::EC2::Instance