坚持使用AWS Parameter Store中的SecureString。我试图将数据库密码称为:
DatabasePassword:
Type: AWS::SSM::Parameter::Value<SecureString>
NoEcho: 'true'
Default: /environment/default/database_password
Description: The database admin account password
这会引发错误:
调用CreateStack操作时发生错误(ValidationError):模板格式错误:无法识别的参数类型:SecureString
但是,如果我将此参数称为String
而不是SecureString
,则会引发另一个错误:
调用CreateStack操作时发生错误(ValidationError):模板引用的参数[/ environment / default / database_password]具有CloudFormation不支持的类型。
我确实尝试使用'{{resolve:ssm-secure:parameter-name:version}}'
,它可用于数据库配置:
MasterUsername: !Ref DatabaseUsername
MasterUserPassword: '{{resolve:ssm-secure:/environment/default/database_password:1}}'
但是,我正在使用AWS Fargate docker容器,在其中将这些值作为环境变量提供:
Environment:
- Name: DATABASE_HOSTNAME
Value: !Ref DatabaseHostname
- Name: DATABASE_USERNAME
Value: !Ref DatabaseUsername
- Name: DATABASE_PASSWORD
Value: '{{resolve:ssm-secure:/environment/default/database_password:1}}'
这会引发错误:
调用CreateStack操作时发生错误(ValidationError):[AWS :: ECS :: TaskDefinition / Properties / ContainerDefinitions / Environment]中不支持SSM安全引用
无法在我的实现中使用安全字符串。有没有解决此问题的方法? AWS去年宣布支持SecureString
,但找不到该文档。我发现所有使用的resolve
仅在某些情况下有效。
参考:
答案 0 :(得分:0)
CloudFormation不支持SecureString
作为模板参数类型。您可以在下面的文档中对其进行确认,请允许我引用它。
此外,AWS CloudFormation 不支持定义模板 参数作为SecureString Systems Manager参数类型。然而, 您可以将安全字符串指定为某些参数的值 通过使用动态参数模式来获得资源。
正如您提到的,您可以使用dynamic parameter patterns
“解决”它,但是只有有限的资源支持它。 ECS
和Fargate
不会。
参考:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html
也许您可以使用Secrets Manager
来解决它,而是将密码设置为容器的环境变量,您的应用程序会在运行时从Secrets Manager
获取密码,这也可以提高安全性,密码会不能在容器内使用明文。
下面您可以看到此解决方案的一个示例,该示例不适用于容器,但是使用环境变量和Secrets Manager
的“工作方式”是相同的。
答案 1 :(得分:0)
AWS Secrets Manager可以用于获取CloudFormation模板的机密,即使它们不是数据库密码之类的东西。
“秘密管理器”的秘密包括三个部分:
然后您将使用以下方法在CloudFormation模板中解决上述秘密:
'{{resolve:secretsmanager:PROD_DB_PASSWORD:SecretString:DB_PASSWORD}}'