Использование секрета менеджера AWS Secrets в облачной информации

Я хочу экспортировать пароль read_only_user в экземпляр EC2. Как я могу получить доступ к созданному паролю внутри UserData?

Resources:
  ReadOnlyUserCredentials:
      Type: AWS::SecretsManager::Secret
      Properties:
        Name: !Sub "${AWS::StackName}/readonly-user-credentials"
        GenerateSecretString:
          SecretStringTemplate: '{"username": "read_only_user"}'
          GenerateStringKey: 'password'
          PasswordLength: 16
          ExcludeCharacters: '"@/\'
  WebServer:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-a4c7edb2
      InstanceType: t2.micro
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash
          echo "${!Join ['', ['{{resolve:secretsmanager:', !Ref ReadOnlyUserCredentials, ':SecretString:password}}' ]]}" > password

Я пробовал использовать! Join, но, конечно, это не работает. Я буду очень признателен за любую помощь здесь.

Обновлять:

      UserData:
        Fn::Base64:
         Fn::Sub:
          - |
            echo ${PasswordStr} > password
          - PasswordStr: !Join ['', ['{{resolve:secretsmanager:', !Ref ReadOnlyUserCredentials, ':SecretString:password}}' ]]

Изменив код, как показано выше, я получил строку разрешения, но не дал мне фактического пароля. Как мне разрешить arn, чтобы получить простой пароль?


person SpaceX    schedule 17.01.2019    source источник
comment
Разве это не то же самое, что stackoverflow.com/ questions / 48625737 /   -  person David Webster    schedule 17.01.2019
comment
Дэвид, ты прав. Используя ссылку выше, я смог передать переменную. Есть ли способ получить доступ к паролю в облачной информации, !Join ['', ['{{resolve:secretsmanager:', !Ref ReadOnlyUserCredentials, ':SecretString:password}}' ]] просто предоставляет строку преобразователя. Как я могу узнать настоящий пароль?   -  person SpaceX    schedule 17.01.2019


Ответы (1)


Вероятно, вы не хотите, чтобы CFN расширял ваш секрет в пользовательских данных, потому что пароль будет встроен в скрипт пользовательских данных в кодировке base64, который отображается в консоли EC2.

Вместо этого вы должны воспользоваться тем фактом, что у вас есть сценарий, который выполняется на хосте и вызывает диспетчер секретов во время выполнения сценария (предупреждение, не проверено):

Resources:
  ReadOnlyUserCredentials:
      Type: AWS::SecretsManager::Secret
      Properties:
        Name: !Sub "${AWS::StackName}/readonly-user-credentials"
        GenerateSecretString:
          SecretStringTemplate: '{"username": "read_only_user"}'
          GenerateStringKey: 'password'
          PasswordLength: 16
          ExcludeCharacters: '"@/\'
  WebServer:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-a4c7edb2
      InstanceType: t2.micro
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash
          yum update -y
          yum install -y jq
          aws --region ${AWS::Region} secretsmanager get-secret-value --secret-id !Ref ReadOnlyUserCredentials --query SecretString --output text | jq -r .password > password
person JoeB    schedule 18.01.2019
comment
Я пробовал это, однако это предполагает, что у вас есть учетные данные для доступа, установленные внутри экземпляра, чтобы выполнять операции с использованием aws cli ... - person Benny; 07.07.2020
comment
Да, вам необходимо использовать роли для EC2, чтобы настроить разрешения для экземпляра на доступ к секрету. Вы можете найти более подробную информацию в предыдущем ответе на динамические ссылки вопрос. - person JoeB; 08.07.2020