我想要在创建模板时引用其他 AWS CloudFormation 堆栈中的资源。
简短描述
以下解决方法提供了一种创建跨堆栈引用的方法的示例。有关其他说明,请参阅演练: 引用其他 AWS CloudFormation 堆栈中的资源输出。
**注意:**要引用其他 AWS CloudFormation 堆栈中的资源,必须先创建跨堆栈引用。要创建跨堆栈引用,请使用 export 字段标记要导出的资源输出的值。然后,使用 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. 依次选择 Create Stack(创建堆栈)和 Design template(设计模板)。
3. 在代码编辑器的 Parameters(参数)选项卡中,选择 Template(模板)。
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. 选择 Create stack(创建堆栈)图标,然后选择 Next(下一步)。
6. 在 Stack name(堆栈名称)中,输入堆栈的名称。
7. 在 Parameters(参数)中,输入要交叉引用的网络堆栈名称(NetworkStack)。
8. 选择 Next(下一步),再次选择 Next(下一步),然后选择 Create(创建)。
9. 堆栈创建完成后,打开 Amazon EC2 控制台。
10. 在导航窗格中,选择 Instances(实例),然后选择您在步骤 4 中使用模板创建的实例。
11. 选择 Description(描述)视图,然后验证是否已配置安全组和子网。
**重要事项:**当其他堆栈正在导入源堆栈或源堆栈的导出值时,您无法删除它们。要更新源堆栈的导出值,请先手动替换要导入源堆栈导出值的堆栈中的实际值。然后,您可以更新源堆栈的导出值。
要列出所有正在导入所导出输出值的堆栈,请运行 list-imports 命令。要列出 AWS 区域中的所有导出,请使用 AWS CloudFormation 控制台或运行 list-exports 命令。每个 AWS 区域的账户的导出名称必须是唯一的。
相关信息
如何在 AWS Systems Manager Parameter Store 中使用参数在 CloudFormation 堆栈之间共享值?
AWS CloudFormation 模板
AWS::EC2::Instance