У нас есть контейнеры 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++.
Роль IAM ECS Task Execution используется самой службой ECS для доступа к таким вещам, как ваш репозиторий ECR. Эта роль используется ECS для доступа к другим сервисам AWS, необходимым для фактического выполнения вашей задачи.
Дополнительная роль ECS Task IAM предоставляется вашим работающим контейнерам задач ECS, чтобы предоставить программному обеспечению, работающему в ваших контейнерах, доступ к ресурсам AWS.
Вам необходимо предоставить задаче ECS роль Task IAM с соответствующими разрешениями SES. AWS SDK, который вы используете в своем коде, автоматически выберет роль ECS Task IAM и будет использовать ее.