在 AWS Cloudformation 中指定 Secret Manager 值的动态引用

San*_*chi 11 amazon-web-services aws-cloudformation aws-secrets-manager

反正我们可以通过动态引用揭秘经理到AWS启动配置用户数据?

这是我尝试过的代码片段:

"SampleLaunchConfig": {
            "Type": "AWS::AutoScaling::LaunchConfiguration",
             "Properties": {
                "ImageId": {
                    "Fn::FindInMap": [
                        "AWSRegionArch2AMI",
                        {
                            "Ref": "AWS::Region"
                        },
                        "AMI"
                    ]
                },
                "UserData": {
                    "Fn::Base64": {
                        "Fn::Join": [
                            "",
                            [
                                "#!/bin/bash -xe\n",
                                "yum update -y\n",
                                "useradd -p <<pwd>>{{resolve:secretsmanager:Credentials:SecretString:userName}}\n",
                                "\n"
                            ]
                        ]
                    }
                }
        }
    }
Run Code Online (Sandbox Code Playgroud)

获取 useradd 时出现错误:无效的用户名 '{{resolve:secretsmanager:Credentials:SecretString:userName}}'

如何将 Secret Manager 秘密值传递给 cloudformation 用户数据?

dir*_*vus 15

似乎{{resolve:...}}动态引用仅在模板内的某些上下文中扩展。

AWS 文档中没有关于您可以在模板中的确切位置使用这些参考的准确信息。目前关于的措辞是{{resolve:secretsmanager:...}}

“secretsmanager 动态引用可用于所有资源属性”

但是,这与您的示例相矛盾,我还观察到动态引用无法在 CloudFormation::Init 数据内部解析。

我有一个与 AWS 相关的有效支持案例,他们同意动态引用的行为记录不充分。随着我了解更多,我会更新这个答案。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-secretsmanager

  • AWS Support 已确认动态引用在 `UserData` 或 `CloudFormation::Init` 属性中**不**解析。它们确实在许多其他资源属性中解析,并且在属性支持动态引用的情况下,您可以在函数调用(!Sub、!Join 等)中使用它们。尚不清楚究竟哪些属性支持这些引用,哪些不支持。我的支持案例仍然开放。 (11认同)
  • 嘿,我想知道 AWS 支持是否设法提供了一些有意义的回报? (3认同)
  • @chrismo,您好,该表指的是“ssm-secure”动态引用。当前的问题是关于 Secrets Manager,这不是同一件事。 (2认同)

Joe*_*oeB 6

我不确定为什么这没有为您正确扩展。但是,您可能不希望 CFN 在用户数据中扩展您的机密,因为密码将嵌入在 EC2 控制台中可见的 base64 编码用户数据脚本中。

相反,您应该利用这样一个事实,即您有一个在主机上执行的脚本并在脚本执行时调用机密管理器(警告未经测试):

"SampleLaunchConfig": {
        "Type": "AWS::AutoScaling::LaunchConfiguration",
         "Properties": {
            "ImageId": {
                "Fn::FindInMap": [
                    "AWSRegionArch2AMI",
                    {
                        "Ref": "AWS::Region"
                    },
                    "AMI"
                ]
            },
            "UserData": {
                "Fn::Base64": {
                    "Fn::Join": [
                        "",
                        [
                            "#!/bin/bash -xe\n",
                            "yum update -y\n",
                            "yum install -y jq\n",
                            !Sub "useradd -p `aws --region ${AWS::Region} secretsmanager get-secret-value --secret-id Credentials --query SecretString --output text | jq -r .passwordKey` `aws --region ${AWS::Region} secretsmanager get-secret-value --secret-id Credentials --query SecretString --output text | jq -r .userName`\n",
                            "\n"
                        ]
                    ]
                }
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

这并不理想,因为它会在命令行上扩展密码。通过首先将密码放在文件中并从那里读取它然后粉碎文件可能会更安全。