Как я могу получить значение секрета из экземпляра EC2?
Я пытаюсь настроить свой экземпляр EC2 так, чтобы скрипт мог получить значение секрета, например, во время загрузки.
Я создал экземпляр EC2 из CentOS AMI и секрет в Secrets Manager. Секрет использует ключ от KMS.
Затем я определил роль IAM с соответствующими политиками для расшифровки секрета и назначил эту роль экземпляру EC2.
Внутри экземпляра я вижу AccessKeyId и SecretAccessKey в метаданных с помощью этой команды (Decrypt-Secret - это имя роли):
$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/Decrypt-Secrets/
{
"Code" : "Success",
"LastUpdated" : "2018-12-06T09:45:55Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "AAAAAAAAAAAAAA",
"SecretAccessKey" : "BBBBBBBBBBBBBBBBBBB",
"Token" : "...",
"Expiration" : "2018-12-06T16:11:24Z"
}
Затем я настраиваю aws cli:
$ aws configure
AWS Access Key ID [None]: AAAAAAAAAAAAAA
AWS Secret Access Key [None]: BBBBBBBBBBBBBBBBBBB
Default region name [us-east-1]: us-east-1
Default output format [None]:
И попытайся получить секрет:
$ aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:us-east-1:1234567890:secret:my-secret-aaaaa
An error occurred (UnrecognizedClientException) when calling the GetSecretValue operation: The security token included in the request is invalid.
Насколько я понимаю, ошибка заключается в том, что я не использую правильный KeyID и AccessKey. Но я не понимаю почему.
Я также пытался создать пользователя IAM, который использует ту же политику, и когда я указываю KeyID и AccessKey этого пользователя, он работает, я могу получить секрет. Но я должен указать идентификатор и ключ вручную, и моей целью является сценарий для автоматического получения секрета.
Что мне не хватает?
2 ответа
Когда вы запускаете CLI aws на экземпляре EC2 с уже настроенной ролью IAM, вам не нужно устанавливать ключ доступа или любую другую информацию (кроме региона).
CLI уже знает, как автоматически подобрать учетные данные из метаданных EC2. Более того, учетные данные в метаданных являются временными и истекают через 6 часов, поэтому вы не хотите хранить их в своей конфигурации.
Удалите кредиты, которые вы сохранили в вашей конфигурации, и снова введите команду с правильным регионом:
aws --region us-east-1 secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:us-east-1:1234567890:secret:my-secret-aaaaa
Только что обнаружил, что мне также нужно настроить токен, указанный в метаданных.
aws configure
запрашивает только KeyID и AccessKey. Для настройки токена мне нужно было сделать:
$ aws configure set aws_session_token "FQoGZXI..."