gpt4 book ai didi

aws-cloudformation - AWS 云形成 : Nested Sub with Dynamic References using {{resolve}} causes error and doesn't execute resolve to get value from Parameter Store

转载 作者:行者123 更新时间:2023-12-02 04:23:23 25 4
gpt4 key购买 nike

我正在尝试使用 AWS CloudFormation Template 创建一个 EC2 实例,其中包含使用模板中的动态引用和跨堆栈引用生成的一些用户数据。 AWS Systems Manager Parameter Store 中存储了一个带有 Name:/MyCustomParameterValue:Test1 的参数。

这个想法是将参数传递给模板堆栈(堆栈A),该模板堆栈引用另一个cloudformation堆栈(堆栈B)。堆栈 B 导出引用“StackB::ParameterStoreName”的变量。堆栈 A 使用 Fn::ImportValue: 'StackB::ParameterStoreName' 获取其值,以便它可以与动态引用方法一起使用,以使用 {{ 从 AWS SSM Parameter Store 获取其值resolve:ssm:/MyCustomParameter:1}} 并将其值传递给模板中的 UserData 字段。我在尝试在此用例中使用嵌套的 Fn::Sub: 函数时遇到困难。

我尝试删除 | 管道并使用带转义换行符的双引号,但这不起作用。

我还尝试使用不同类型的资源及其工作属性。下面是有效代码的示例。

Resources:
TestBucket:
Type: 'AWS::S3::Bucket'
Properties:
BucketName:
Fn::Sub:
- '${SSMParameterValue}-12345'
- SSMParameterValue:
Fn::Sub:
- '{{resolve:ssm:${SSMParameterName}:1}}'
- SSMParameterName:
Fn::ImportValue:
!Sub '${CustomStack}::ParameterStoreName'

下面是我当前代码的摘录:

Parameters:
CustomStack:
Type: "String"
Default: "StackB"
Resources:
MyCustomInstance:
Type: 'AWS::EC2::Instance'
Properties:
UserData:
Fn::Base64:
Fn::Sub:
- |
#!/bin/bash -e
#
# Bootstrap and join the cluster
/etc/eks/bootstrap.sh --b64-cluster-ca '${SSMParameterValue}' --apiserver-endpoint '${Endpoint}' '${ClusterName}'"
- SSMParameterValue:
Fn::Sub:
- '{{resolve:ssm:/${SSMParameterName}:1}}'
- SSMParameterName:
Fn::ImportValue:
!Sub '${CustomStack}::ParameterStoreName'
Endpoint:
Fn::ImportValue:
!Sub '${CustomStack}::Endpoint'
ClusterName:
Fn::ImportValue:
!Sub '${CustomStack}::ClusterStackName'

当前输出:

#!/bin/bash -e 
#
# Bootstrap and join the cluster
/etc/eks/bootstrap.sh --b64-cluster-ca `{{resolve:ssm:MyCustomParameter:1}}` --apiserver-endpoint 'https://04F1597P0HJ11FQ54K0YFM9P19.gr7.us-east-1.eks.amazonaws.com' 'eks-cluster-1'

预期输出:

#!/bin/bash -e 
#
# Bootstrap and join the cluster
/etc/eks/bootstrap.sh --b64-cluster-ca `Test1` --apiserver-endpoint 'https://04F1597P0HJ11FQ54K0YFM9P19.gr7.us-east-1.eks.amazonaws.com' 'eks-cluster-1'

最佳答案

我认为这是因为解析是在base64中,也许......?当它处理该行时,它只看到一个 base64 block ,而不是 {{resolve...}} 代码。 “解析”在比 !Functions 更晚的过程中得到处理,因为它们在代码运行之前无法解析。

为了解决这个问题,我添加了一个临时 SSM 参数:

eksCAtmp:
Type: "AWS::SSM::Parameter"
Properties:
Type: String
Value:
Fn::Join:
- ''
- - '{{resolve:ssm:'
- Fn::ImportValue:
!Sub "${ClusterName}-EksCA"
- ':1}}'

导入原始 SSM 参数并消除“导入”并再次解析的要求。所以现在您可以使用 !GetAtt eksCAtemp.Value

例如:

  UserData: !Base64
"Fn::Sub":
- |
#!/bin/bash
set -o xtrace
/etc/eks/bootstrap.sh ${ClusterName} --b64-cluster-ca ${CA} --apiserver-endpoint ${endpoint} --kubelet-extra-args '--read-only-port=10255'
/opt/aws/bin/cfn-signal --exit-code $? \
--stack ${AWS::StackName} \
--resource NodeGroup \
--region ${AWS::Region}
- endpoint:
Fn::ImportValue:
!Sub "${ClusterName}-EksEndpoint"
CA: !GetAtt eksCAtmp.Value

(当然,如果他们允许跨堆栈导出超过 1024 个字符,我们就不需要它来在专用网络上启动 EKS。)

关于aws-cloudformation - AWS 云形成 : Nested Sub with Dynamic References using {{resolve}} causes error and doesn't execute resolve to get value from Parameter Store,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57617393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com