内部函数 Fn::ImportValue
返回由另一个堆栈导出的输出的值。您通常使用此函数来创建跨堆栈引用。在以下示例模板代码段中,堆栈 A 导出 VPC 安全组值,而堆栈 B 导入这些值。
注意
以下限制适用于跨堆栈引用:
-
对于每个 AWS 账户,
Export
名称在区域内必须是唯一的。 -
不能跨区域创建跨堆栈引用。您可以使用内置函数
Fn::ImportValue
仅导入已在同一区域内导出的值。 -
对于输出,
Export
的Name
属性值无法使用依赖于资源的Ref
或GetAtt
函数。同样,
ImportValue
函数无法包含依赖于资源的Ref
或GetAtt
函数。 -
在另一个堆栈导入输出值后,您将无法删除正在导出输出值的堆栈或修改已导出的输入值。必须先删除所有导入,然后才能删除导出堆栈或修改输出值。
JSON
堆栈 A 导出
"Outputs" : {
"PublicSubnet" : {
"Description" : "The subnet ID to use for public web servers",
"Value" : { "Ref" : "PublicSubnet" },
"Export" : { "Name" : {"Fn::Sub": "${AWS::StackName}-SubnetID" }}
},
"WebServerSecurityGroup" : {
"Description" : "The security group ID to use for public web servers",
"Value" : { "Fn::GetAtt" : ["WebServerSecurityGroup", "GroupId"] },
"Export" : { "Name" : {"Fn::Sub": "${AWS::StackName}-SecurityGroupID" }}
}
}
YAML
堆栈 A 导出
Outputs:
PublicSubnet:
Description: The subnet ID to use for public web servers
Value:
Ref: PublicSubnet
Export:
Name:
'Fn::Sub': '${AWS::StackName}-SubnetID'
WebServerSecurityGroup:
Description: The security group ID to use for public web servers
Value:
'Fn::GetAtt':
- WebServerSecurityGroup
- GroupId
Export:
Name:
'Fn::Sub': '${AWS::StackName}-SecurityGroupID'
JSON
堆栈 B 导入
"Resources" : {
"WebServerInstance" : {
"Type" : "AWS::EC2::Instance",
"Properties" : {
"InstanceType" : "t2.micro",
"ImageId" : "ami-a1b23456",
"NetworkInterfaces" : [{
"GroupSet" : [{"Fn::ImportValue" : {"Fn::Sub" : "${NetworkStackNameParameter}-SecurityGroupID"}}],
"AssociatePublicIpAddress" : "true",
"DeviceIndex" : "0",
"DeleteOnTermination" : "true",
"SubnetId" : {"Fn::ImportValue" : {"Fn::Sub" : "${NetworkStackNameParameter}-SubnetID"}}
}]
}
}
}
YAML
堆栈 B 导入
Resources:
WebServerInstance:
Type: 'AWS::EC2::Instance'
Properties:
InstanceType: t2.micro
ImageId: ami-a1b23456
NetworkInterfaces:
- GroupSet:
- Fn::ImportValue:
'Fn::Sub': '${NetworkStackNameParameter}-SecurityGroupID'
AssociatePublicIpAddress: 'true'
DeviceIndex: '0'
DeleteOnTermination: 'true'
SubnetId: Fn::ImportValue:
'Fn::Sub': '${NetworkStackNameParameter}-SubnetID'
声明
JSON
{ "Fn::ImportValue" : sharedValueToImport
}
YAML
您可以使用完整的函数名称:
Fn::ImportValue: sharedValueToImport
或者,您也可以使用短格式:
!ImportValue sharedValueToImport
重要
当包含 !Sub
的简写形式时,不能使用 !ImportValue
的简写形式。
# do not use
!ImportValue
!Sub '${NetworkStack}-SubnetID'
此时,您必须使用完整的函数名称,例如:
Fn::ImportValue:
!Sub "${NetworkStack}-SubnetID"
参数
- sharedValueToImport
-
要导入的堆栈输出值。
返回值
堆栈输出值。
示例
JSON
{ "Fn::ImportValue" : {"Fn::Sub": "${NetworkStackNameParameter}-SubnetID" } }
YAML
Fn::ImportValue:
!Sub "${NetworkStackName}-SecurityGroupID"
支持的函数
您可在 Fn::ImportValue
函数中使用以下函数。这些函数的值无法依赖资源。
-
Fn::Base64
-
Fn::FindInMap
-
Fn::If
-
Fn::Join
-
Fn::Select
-
Fn::Sub
-
Ref