#amazon-web-services #spring-boot #spring-cloud
#amazon-веб-сервисы #весенняя загрузка #spring-облако
Вопрос:
Я перенес приложение с использованием Spring Cloud AWS (2.1.0.RELEASE) из экземпляра ECS / EC2 в ECS / Fargate, и оно вылетает при загрузке, не в состоянии получить учетные данные из экземпляра.
У экземпляра EC2 не было учетных данных, так что это стало неожиданностью. В обоих случаях роль должна предоставлять все необходимые разрешения. Приложению, по сути, требуется доступ к хранилищу параметров, и ничего больше.
Кто-нибудь может подтвердить, что это должно работать / работает должным образом? Я не уверен, что отлаживать в противном случае.
Редактировать: меня просят предоставить пример кода. Написанного мной Java-кода нет, поэтому все зависит от конфигурации, которой я делюсь ниже.
Мой pom.xml
включает:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-aws-parameter-store-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-aws-autoconfigure</artifactId>
</dependency>
Внутри src/main/resources/bootstrap.yml
у меня есть:
spring:
application:
name: myapp
cloud:
consul:
enabled: false
config:
enabled: false
aws:
paramstore:
enabled: false
cloud:
aws:
stack:
auto: false
credentials:
instance-profile: false
region:
static: eu-west-2
auto: false
Внутри src/main/resources/bootstrap-aws.yml
(который активируется через профиль aws
в командной строке):
aws:
paramstore:
prefix: /services/app
default-context: common
profile-separator: '_'
fail-fast: true
enabled: true
Комментарии:
1. Можете ли вы показать соответствующий код?
2. Не уверен, о чем вы просите — в этом нет кода Java. Библиотека выполняет это на основе обнаруженной среды.
3. Вы действительно ожидаете, что кто-то поможет вам, не предоставляя никаких подробностей о вашем приложении?! Отвечая на ваш вопрос: Да, я могу подтвердить, что Spring Cloud AWS работает с Fargate.
Ответ №1:
Теперь я работаю с Fargate. Это не имело никакого отношения к приложению Java, это было полностью связано с правами на развертывание ECS, как я попытаюсь объяснить.
ECS: EC2
ECS по умолчанию использует экземпляры EC2 для развертывания задач (содержащих контейнеры). Для этого в каждом экземпляре EC2 используется агент ECS, который, в свою очередь, взаимодействует с механизмом Docker; этот агент ECS по умолчанию не имеет прав, что означает, что он не может загружать частные изображения (например, из ECR) или записывать журналы в CloudWatch (например).
Чтобы исправить это, мы создаем роль IAM и запускаем задачу с ExecutionRoleArn
(в CloudFormation) ссылкой на это. Для роли IAM необходимы права ecr и ведения журналов.
Теперь, в спешке, я добавил к этому права на хранение параметров, не задумываясь больше об этом, и, вуаля, мое приложение было успешно запущено и получало значения хранилища параметров. Оказывается, что в режиме EC2 права, предоставленные агенту ECS, наследуются запущенным контейнером (моим приложением).
ECS: Fargate
При переключении на Fargate вышеуказанное прерывается. ExecutionRoleArn
Остается актуальным, но не наследуется запущенным контейнером. Так что нет смысла предоставлять права на хранение ит-параметров.
Добавьте в определение задачи TaskRoleArn
и укажите на другую роль. На этот раз предоставьте права в этой новой роли для вызова сервисов AWS, которые требуются вашему контейнеру (приложению) — хранилище параметров, S3, SQS и т.д.
С этим покончено, мое приложение удовлетворено. Не стесняйтесь обновлять с любыми исправлениями, поскольку на данный момент это написано с учетом моего понимания и опыта.
Возможно, было бы лучше назвать ExecutionRoleArn
как AgentRoleArn
и TaskRoleArn
as ApplicationRoleArn
, но это только моя точка зрения.