如何仅在资源存在时使用 Fn::GetAttr?
How can I use Fn::GetAttr only when the resource exist?
我正在制作一个主堆栈和两个嵌套堆栈。
第一个嵌套堆栈是创建 Lambda 的堆栈。
第二个嵌套堆栈创建 Apigateway。
制作 Apigateway 时,我将一些 Lambda 输出发送到 Apigateway 模板。
但是在某些情况下不会创建某些 Lambda 输出。
所以当我使用 Fn::GetAttr
将一些输出发送到 Apigateway 模板时。我得到一个错误,因为输出不存在。
[Lambda 模板(嵌套堆栈)]
由于条件 conditionNeedMock
,未创建 MockServerArn 输出。
...
Outputs:
MockServerArn:
Condition: conditionNeedMock
Description: lambdaMock function Arn
Value: !GetAttr lambdaMock.Arn
...
[主模板]
LambdaStack.Ouputs.MockserverArn
未创建,因此在使用 !GetAttr
.
时出现错误
...
Resources:
LambdaStack:
Type: AWS::CloudFormation::Stack
...
ApiGatewayStack:
Type: AWS::CloudFormation::Stack
DependsOn: LambdaStack
Properties:
TemplateURL: apigateway.yml
TimeoutInMinutes: 20
Parameters:
paramMockServerArn: !GetAtt LambdaStack.Outputs.MockServerArn
...
唯一可行的方法(不引入自定义资源)是如果 conditionNeedMock
也在根堆栈中:
paramMockServerArn: !If [conditionNeedMock, !GetAtt LambdaStack.Outputs.MockServerArn, !Ref "AWS::NoValue"]
我正在制作一个主堆栈和两个嵌套堆栈。 第一个嵌套堆栈是创建 Lambda 的堆栈。 第二个嵌套堆栈创建 Apigateway。
制作 Apigateway 时,我将一些 Lambda 输出发送到 Apigateway 模板。 但是在某些情况下不会创建某些 Lambda 输出。
所以当我使用 Fn::GetAttr
将一些输出发送到 Apigateway 模板时。我得到一个错误,因为输出不存在。
[Lambda 模板(嵌套堆栈)]
由于条件 conditionNeedMock
,未创建 MockServerArn 输出。
...
Outputs:
MockServerArn:
Condition: conditionNeedMock
Description: lambdaMock function Arn
Value: !GetAttr lambdaMock.Arn
...
[主模板]
LambdaStack.Ouputs.MockserverArn
未创建,因此在使用 !GetAttr
.
...
Resources:
LambdaStack:
Type: AWS::CloudFormation::Stack
...
ApiGatewayStack:
Type: AWS::CloudFormation::Stack
DependsOn: LambdaStack
Properties:
TemplateURL: apigateway.yml
TimeoutInMinutes: 20
Parameters:
paramMockServerArn: !GetAtt LambdaStack.Outputs.MockServerArn
...
唯一可行的方法(不引入自定义资源)是如果 conditionNeedMock
也在根堆栈中:
paramMockServerArn: !If [conditionNeedMock, !GetAtt LambdaStack.Outputs.MockServerArn, !Ref "AWS::NoValue"]