gpt4 book ai didi

amazon-web-services - 从 SecretsManager 加载的分割字符串

转载 作者:行者123 更新时间:2023-12-03 07:31:46 25 4
gpt4 key购买 nike

我正在尝试创建一个 ListenerRule,它仅接受从 Secrets Manager 加载的某些 IP 地址。这是我的原始代码:

LoadBalancerRule:
Type: AWS::ElasticLoadBalancingV2::ListenerRule
Properties:
Actions:
- TargetGroupArn: !Ref 'TargetGroup'
Type: 'forward'
Conditions:
Fn::If:
- IsProdEnvironment
- - Field: host-header
Values:
- !Ref 'BaseUrl'
- - Field: host-header
Values:
- !Ref 'BaseUrl'
- Field: source-ip
SourceIpConfig:
Values:
- !Split [ ';', !Sub '{{resolve:secretsmanager:/${ProjectName}/${EnvType}/${ServiceName}:SecretString:ALLOWED_IPS}}' ]

上述解析似乎工作正常,并解析为类似 1.2.3.4/32;2.3.4.5/32;4.5.6.7/29;5.6.7.8/32 的字符串(地址明显被混淆)但数量和子网掩码是相同的)。

但是,当我尝试部署模板时,出现错误:

指定值“1.2.3.4/32;2.3.4.5/32;4.5.6.7/29;5.6.7.8/32”不是有效的 CIDR block (服务:AmazonElasticLoadBalancingV2;状态代码:400;错误代码:ValidationError;请求ID:error-id)

此错误本身表明 !Split 执行了某些操作,因为 CloudFormation 不会报告错误属性值的值必须是字符串列表类型。显然,字符串已转换为包含一个元素的列表,但它没有被 ; 字符拆分为 4 个字符串的列表。

此外,当我尝试运行非常相似的代码但使用硬编码值而不是 secret 时,它工作得很好:

LoadBalancerRule:
Type: AWS::ElasticLoadBalancingV2::ListenerRule
Properties:
Actions:
- TargetGroupArn: !Ref 'TargetGroup'
Type: 'forward'
Conditions:
Fn::If:
- IsProdEnvironment
- - Field: host-header
Values:
- !Ref 'BaseUrl'
- - Field: host-header
Values:
- !Ref 'BaseUrl'
- Field: source-ip
SourceIpConfig:
Values:
!Split [';', '1.2.3.4/32;2.3.4.5/32;4.5.6.7/29;5.6.7.8/32' ]

我还检查了没有 !Sub 的版本,但使用了 Secret 值的硬编码路径:

LoadBalancerRule:
Type: AWS::ElasticLoadBalancingV2::ListenerRule
Properties:
Actions:
- TargetGroupArn: !Ref 'TargetGroup'
Type: 'forward'
Conditions:
Fn::If:
- IsProdEnvironment
- - Field: host-header
Values:
- !Ref 'BaseUrl'
- - Field: host-header
Values:
- !Ref 'BaseUrl'
- Field: source-ip
SourceIpConfig:
Values: !Split [';', '{{resolve:secretsmanager:/dummy-project/dev/foo:SecretString:ALLOWED_IPS}}']

结果我得到了与第一种情况相同的错误:长字符串没有被分割成更小的部分。

为了让这变得更奇怪......这是相当大的模板的一部分,但是当我将此资源复制到一个简单的 test.yaml 时,它获取生成 SecretManager 路径所需的参数列表似乎工作正常...

我在这里做错了什么?

最佳答案

我无法提供完整的答案,因为我同意@OleksiiDonoha,并且我相信 resolve:secretsmanager在执行所有内部函数之后,在更改集创建期间最后解析。

但是,我想澄清一下这一说法:

This error by itself suggests that !Split does something because CloudFormation does not report error Value of property Values must be of type List of String.

!Split仅使用String ,不是字符串列表,与 Select 不同。另外,如果您提供错误的分隔符,它只会返回原始字符串。

那么 Split 发生了什么?我认为,如下:

在表达式中:

  Values:
- !Split [ ';', !Sub '{{resolve:secretsmanager:/${ProjectName}/${EnvType}/${ServiceName}:SecretString:ALLOWED_IPS}}' ]

!Sub首先执行,最终得到(例如):

  Values:
- !Split [ ';', '{{resolve:secretsmanager:/MyProject/TestType/MyService:SecretString:ALLOWED_IPS}}' ]

然后!Split执行并尝试分割字符串 '{{resolve:secretsmanager:/MyProject/TestType/MyService:SecretString:ALLOWED_IPS}}'通过; 。它不能,因此你最终会得到:

  Values:
- '{{resolve:secretsmanager:/MyProject/TestType/MyService:SecretString:ALLOWED_IPS}}'

现在这个问题终于得到解决,结果是:

  Values:
- "1.2.3.4/32;2.3.4.5/32;4.5.6.7/29;5.6.7.8/32"

这可以解释你的错误。

我目前看到的唯一解决方案是使用自定义资源,该资源可以在内部函数评估之前或通过内部堆栈获取 secret 。

或者,您可以链接堆栈(一个堆栈生成进入下一个堆栈参数的输出),您可以解析第一个堆栈中的 secret ,然后将 CIDR 字符串列表作为参数传递给第二个堆栈。

希望这有帮助。

关于amazon-web-services - 从 SecretsManager 加载的分割字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62154143/

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