Spring Cloud AWS и Fargate

#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 , но это только моя точка зрения.