默认值AWS替换为伪参数参考

时间:2020-06-15 19:07:03

标签: amazon-web-services amazon-cloudformation

我在AWS cloudformation模板中有一个参数

 Parameters:
   ExecRole:
     Type: String
     Description: Required. Lambda exec role ARN
     Default: arn:aws:iam::123456789:role/lambdaExecRole

假设123456789是我要使用伪参数引用的AcountId,但是我做不到,我尝试以下操作均未成功

Default: arn:aws:iam::!Ref{AWS::AccountId}:role/exLambdaExecRole
Default: !Sub 'arn:aws:iam::${AWS::AccountId}:role/exLambdaExecRole'

在最后一种情况下,我抛出一个错误

默认成员必须是字符串。

2 个答案:

答案 0 :(得分:1)

假设这始终是角色,为什么您不能作为参数要求传入nae,然后在CloudFormation模板的“资源”部分中使用Sub内在函数进行替换。

这样,您的get-object on a file in the folder, I get access denied部分的arn不需要成为该参数的一部分。

答案 1 :(得分:1)

似乎!Sub的默认值不支持函数(例如Parameters)。

这是我们正在使用的解决方法。

我们有一个名为Parameters的单独堆栈,该堆栈导出其他堆栈中所需的任何参数。例如:

Outputs:
  VpcId:
    Description: Id of the VPC.
    Value: !Ref VpcId
    Export:
      Name: !Sub 'stk-${EnvType}-${EnvId}-VpcId'

在其他堆栈中,我们仅导入以下导出的值:

  VpcId: !ImportValue
    'Fn::Sub': 'stk-${EnvType}-${EnvId}-VpcId'

EnvTypeEnvId对于一个环境的所有堆栈都是相同的。

使用角色,您可能需要执行以下操作。创建一个单独的Roles模板,在其中实现您的角色并导出其ARN:

Outputs:
  LambdaExecutionRoleArn:
    Description: ARN of the execution role for the log-and-pass function.
    Value: !GetAtt
      - LambdaExecutionRole
      - Arn
    Export:
      Name: !Sub 'stk-${EnvType}-${EnvId}-roles-LambdaExecutionRole-Arn'

同样,在其他堆栈中,您也可以简单地ImportValue

    Role: !ImportValue
      'Fn::Sub': 'stk-${EnvType}-${EnvId}-roles-LogAndPassFunctionExecutionRole-Arn'