Почему контейнер ECS Fargate не может найти учетные данные роли выполнения задачи?

У нас есть контейнеры Docker, работающие в ECS Fargate. Они используют AWS SDK для Go V2 и настраивают SDK следующим образом.

        cfg, err := config.LoadDefaultConfig(context.TODO())

Мы хотим отправить электронное письмо, поэтому настраиваем SES:

        repo.client = ses.NewFromConfig(cfg)

При попытке отправить электронное письмо не удается найти учетные данные:

Get "http://169.254.169.254/latest/meta-data/iam/security-credentials/": dial tcp 169.254.169.254:80: connect: invalid argument

Кажется, он пытается подключиться к конечной точке IMDS, принадлежащей ECS, работающей на EC2, а не к точке Fargate. Что здесь не так?

Полная ошибка для справки:

failed to refresh cached credentials, no EC2 IMDS role found, operation error ec2imds: GetMetadata, exceeded maximum number of attempts, 3, request send failed, Get "http://169.254.169.254/latest/meta-data/iam/security-credentials/": dial tcp 169.254.169.254:80: connect: invalid argument

Роль выполнения задач ECS имеет политику, которая разрешает полный доступ к SES (для тестирования), так что проблема не в этом. В документации AWS указано, что контейнеры Fargate используют следующий адрес для учетных данных. curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html

🤔 А знаете ли вы, что...
С Go легко интегрировать код на других языках, включая C и C++.


2
310
1

Ответ:

Решено

Роль IAM ECS Task Execution используется самой службой ECS для доступа к таким вещам, как ваш репозиторий ECR. Эта роль используется ECS для доступа к другим сервисам AWS, необходимым для фактического выполнения вашей задачи.

Дополнительная роль ECS Task IAM предоставляется вашим работающим контейнерам задач ECS, чтобы предоставить программному обеспечению, работающему в ваших контейнерах, доступ к ресурсам AWS.

Вам необходимо предоставить задаче ECS роль Task IAM с соответствующими разрешениями SES. AWS SDK, который вы используете в своем коде, автоматически выберет роль ECS Task IAM и будет использовать ее.