读取 CloudFormation 用户数据中的 AWS 秘密

Sha*_*hah 2 amazon-web-services aws-cloudformation

我有下面的 CloudFormation 模板,主要创建一个 Secrets 和一个 EC2。我想更改 EC2 中的一些配置文件,并且需要使用用户数据将 Secrets 中的值放入变量中,但我无法从 Secrets 中获取值。你能帮我解决我的代码吗

AWSTemplateFormatVersion: 2010-09-09
Description: builds secretsManager and ec2

Parameters:
  EnvironmentName:
    Type: String
  SharedVpcID:
    Type: AWS::EC2::VPC::Id
  SharedPubSubnetID1:
    Type: AWS::EC2::Subnet::Id
  SharedPubSubnetID2:
    Type: AWS::EC2::Subnet::Id
  PrivateSubnetId:
    Type: AWS::EC2::Subnet::Id
  SecretValue: 
    Type: String
    Default: "{{resolve:secretsmanager:${SecretsManager}:SecretString:password}}"
 
Resources:

  SharedVPCDefaultSecurityGroup:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: https://advanced-artefacts.s3-eu-west-1.amazonaws.com/internal/templates/sg/securitygroup.yaml
      Parameters: 
        EnvironmentName: !Ref EnvironmentName
        VPCID: !Ref SharedVpcID 
 
  SecretsManager:
    Type: AWS::SecretsManager::Secret
    Properties:
      Description: 'This is my rds instance secret'
      GenerateSecretString:
        SecretStringTemplate: '{"username": "admin"}'
        GenerateStringKey: 'password'
        PasswordLength: 16
        ExcludeCharacters: '"@/\'

  WebInstance:
    Type: AWS::EC2::Instance
    Properties:
        InstanceType: t2.micro
        ImageId: ami-08b993f76f42xxxxx
        NetworkInterfaces: 
          - AssociatePublicIpAddress: true
            DeviceIndex: "0"
            GroupSet: 
              - !GetAtt SharedVPCDefaultSecurityGroup.Outputs.DefaultSecurityGroup
            SubnetId: !Ref SharedPubSubnetID1
        KeyName: xxx
        UserData:
          Fn::Base64: !Sub |
            #!/bin/bash -xe
              PasswordStr1='{{resolve:secretsmanager:${SecretsManager}:SecretString:password}}'
              export $PasswordStr1
              sudo echo $PasswordStr1
              PasswordStr2={SecretValue}
              export $PasswordStr2
              sudo echo $PasswordStr2
Run Code Online (Sandbox Code Playgroud)

Mar*_*cin 5

遗憾的是这不会起作用。您尝试在 userdata 中使用 Secretmanager 存在安全风险,因为它会将您的密码以纯文本形式保留在 UserData 中。而且 Secretmanager 动态参数只能在资源属性中使用。

相反,您应该在用户数据中使用AWS CLI从密钥管理器获取密钥。这将需要具有在 UserData 执行时访问管理器的权限的AWS 实例角色。