Я использую сервис AWS ECS для организации своего контейнера докеров.
Также используется Secret Manager для хранения и извлечения личной информации.
Я применяю политику SecretsManagerReadWrite
к своим ecsTaskExecutionRole
и ecsServiceRole
.
Перед использованием Fargate
я просто использовал ECS с EC2.
И это работает нормально.
Но в fargate
он бросает NoCredentialsError
Я обратился к секретному менеджеру через скрипт Python, созданный с помощью boto3. (https://docs.aws.amazon.com/ko_kr/code-samples/latest/catalog/python-secretsmanager-secrets_manager.py.html)
Есть ли здесь решение?
Спасибо.
ПОЛЬЗОВАТЕЛЬСКОЕ разрешение
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"secretsmanager:GetSecretValue",
"ssm:GetParameters"
],
"Resource": "*"
}
]
}
Убедитесь, что примененная политика IAM имеет следующие разрешения:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:GetParameters",
"secretsmanager:GetSecretValue",
"kms:Decrypt"
],
"Resource": [
"arn:aws:ssm:<region>:<aws_account_id>:parameter/parameter_name",
"arn:aws:secretsmanager:<region>:<aws_account_id>:secret:secret_name",
"arn:aws:kms:<region>:<aws_account_id>:key/key_id"
]
}
]
}
Также убедитесь, что вы используете Fargate 1.3.0 (https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html)
Но я бы попробовал что-то еще, чтобы уменьшить количество кода. С ноября 2018 года нет необходимости писать собственный код для получения секретов из Secret Manager. ECS/Fargate может сделать это за вас. Просто дайте ECS разрешение на доступ к вашему секрету и укажите секретный ARN в определении задачи. ECS/Fargate назначит секрет переменной среды. Ваш код просто должен прочитать переменную среды, как обычно.
Например :
"containerDefinitions": [
{
"secrets": [
{
"name": "environment_variable_name",
"valueFrom": "arn:aws:ssm:region:aws_account_id:parameter/parameter_name"
}
]
}
]
Документ здесь: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html
Правильно, вы можете назначить секретный ARN переменной среды в своем определении задачи. На уровне кода вам просто нужно прочитать файл env. переменная, как обычно. Под сценой ECS/Fargate получит секрет от Secret Manager. Это уменьшает объем специального кода AWS для записи в ваше приложение.
Я создал пользовательскую политику (ваш первый код) в iam - policy
и прикрепил ее к ecsTaskExecutionRole
и ecsServiceRole
, но она тоже не работает. Это неправильный путь?
Также добавил свое пользовательское разрешение json в свой пост.
ecsTaskExecutionRole
должно хватить. Это разрешение, к которому контейнер имеет доступ во время выполнения. Только что протестировано на кластере здесь и работает
Я думаю, что ваше предложение связано с ssm parameter store
. Но я использую Secret Manager
.
Теперь мое предложение работает как с хранилищем параметров, так и с менеджером секретов. Правильно ли вы использовали ключ valueFrom
(а не value
) в JSON определения задачи?
Также обязательно используйте ключ secret
и не храните свой ARN в разделе environment
. Пример из моей задачи: "secrets": [ { "valueFrom": "arn:aws:secretsmanager:eu-west-1:48000000093:secret:my_secret-SUr3hB", "name": "SECRET" }
Я правильно использую valueFrom
. Во всяком случае, я изменил SecretManager
на SSM
, и это решилось. Спасибо :)
Возможно, кому-то будет полезно: при создании политики с помощью визуального редактора обязательно выберите «ssm:GetParameters», а не «ssm:GetParameters».
Я наткнулся на эту тему при устранении той же проблемы. В моем случае разрешения были правильно настроены. Однако ARN менеджера секретов не был полным.
Я прошел ARN как:
arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:nonprod-testapp-rds-password"
Вместо:
arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:nonprod-testapp-rds-password-wdxsae
Проблема была решена после передачи полного ARN секрета как Secrets в определении контейнера.
Вы имеете в виду, что я просто назначаю rn моему определению задачи, и оно автоматически сохраняется в переменной среды? Или мне нужно дополнительное поведение для этого? Я хочу сохранить всю переменную моего секретного менеджера в переменной среды моей системы. Потому что разобрал его в моем приложении.