我希望在 AWS CloudFormation 中创建模板时引用其他 AWS CloudFormation 堆栈中的资源。
解决方法
要引用其他 CloudFormation 堆栈中的资源,必须先创建跨堆栈引用。以下解决方法通过示例介绍了一种创建跨堆栈引用的方法。示例 NetworkStack 堆栈创建了 ${AWS::StackName}-SecurityGroupID 和 ${AWS::StackName}-SubnetID 网络相关资源并导出。创建堆栈后,CloudFormation 将 ${AWS::StackName} 替换为 NetworkStack。最终的导出名称为 NetworkStack-SecurityGroupID 和 NetworkStack-SubnetID。
创建用于导出输出值的堆栈
完成以下步骤:
- 创建 CloudFormation 堆栈,然后使用 SampleNetworkCrossStack 模板。
注意:必须在模板的输出部分声明导出字段。
- 将堆栈命名为 NetworkStack。
**注意:**NetworkStack 导出子网和安全组值。
使用导入的子网和安全组创建 Amazon EC2 实例
Amazon Elastic Compute Cloud(Amazon EC2)实例属性(例如 SubnetId 和 SecurityGroupId)使用导出堆栈中的值。要导入这些值,请使用 Fn::ImportValue 内置函数。
**注意:**导入和导出堆栈必须位于同一 AWS 区域和 AWS 账户中。此外,导出的值名称对于您的区域和账户必须是唯一的。
要创建 EC2 实例,请完成以下步骤:
- 打开 CloudFormation 控制台。
- 依次选择创建堆栈和设计模板。
- 选择代码编辑器的参数选项卡,然后选择模板。
- 要使用导出堆栈中的值来创建实例,请在代码编辑器中输入以下模板:
**重要事项:**将 NetworkStack 资源栈设置为 NetworkStackParameter 的值。NetworkStack 值取代了对应 Fn::ImportValue 函数中的正确堆栈名称。
{ "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"
}
}
}
]
}
}
}
}
**注意:**将 t2.micro 替换为相应实例类型,将 ami-a1b23456 替换为相应亚马逊机器映像(AMI)ID。
- 选择创建堆栈(带有向上箭头的云图标),然后选择下一步。
- 对于堆栈名称,输入堆栈的名称。
- 在参数中,输入要交叉引用的网络堆栈名称(例如NetworkStack)。
- 选择下一步,然后再次选择下一步。
- 选择创建。
- 堆栈状态更改为 CREATE_COMPLETE 后,打开 Amazon EC2 控制台。
- 在导航窗格中,选择实例,然后选择创建的实例。
- 选择描述选项卡,然后验证是否已配置安全组和子网。
**重要事项:**当其他堆栈正在导入源堆栈或源堆栈的导出值时,无法删除这些值。要更新源堆栈的导出值,请先手动替换正在导入源堆栈导出值的堆栈中的值。然后即可更新源堆栈的导出值。
要列出所有正在导入已导出输出值的堆栈,请运行 list-imports 命令。要列出区域中的所有导出,请使用 CloudFormation 控制台或运行 list-exports 命令。账户的导出名称在该区域中必须是唯一的。
**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保使用的是最新版本的 AWS CLI。
相关信息
如何在 AWS Systems Manager Parameter Store 中使用参数在 CloudFormation 堆栈之间共享值?
AWS CloudFormation 模板
AWS::EC2::Instance
引用其他 CloudFormation 堆栈中的资源输出