Как прочитать параметры SSM при использовании AWS Codebuild? - PullRequest
0 голосов
/ 25 апреля 2018

В настоящее время я успешно использую codebuild для простых задач сборки (в конфигурации не vpc).

Но теперь я пытаюсь запустить задачу сборки, которая считывает значение параметра SSM, и не удается, потому что не может загрузить учетные данные, очевидная причина:

com.amazonaws.auth.InstanceProfileCredentialsProvider@5754b242: Unable to load credentials from service endpoint

Роль службы IAM, которую я выделил проекту codebuild, имеет разрешение ssm:GetParameters для параметра, который я пытаюсь прочитать (и если бы это было проблемой, я ожидал бы увидеть unauthorized сообщение, а не unable to load credentials).

Я использую Java SDK для выполнения вызова SSM GetParameter, который, как я подтвердил, действительно работает для чтения параметров SSM при запуске из экземпляра EC2, поэтому я почти уверен, что проблема здесь в Codebuild.

Чтобы дополнительно диагностировать проблему, я попытался добавить команду построения, чтобы выполнить curl для адреса метаданных экземпляра AWS:

curl 169.254.169.254/latest/meta-data/iam/info

Вместо того, чтобы возвращать метаданные экземпляра, как это было бы из обычной среды EC2, он просто истекает.

Таким образом, похоже, что корень проблемы в том, что среда codebuild не работает с адресом поиска метаданных AWS, что приводит к тому, что цепочка провайдеров AWS не может искать учетные данные.

Как я могу прочитать параметры SSM из codebuild (без жесткого кодирования или использования переменных среды для учетных данных SDK)?

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Ваш AWS Java SDK, вероятно, устарел. Минимальная версия для получения учетных данных в CodeBuild - 1.11.16. https://docs.aws.amazon.com/codebuild/latest/userguide/troubleshooting.html#troubleshooting-versions

0 голосов
/ 30 апреля 2018

Ответ от MaiKaY - лучшее решение проблемы «как получить значения параметров SSM в вашей сборке» (лучше, если buildspec привязывается к имени параметра SSM, а не к коду или сборкескрипты).

Но в случае, если кто-то еще наткнется на этот вопрос, имея дело с той же самой проблемой, - проблема была в основном коде из исходного вопроса, в некотором роде связанном с ответом от Clare Liguori.

Я использовал последний AWS SDK - но я использовал его неправильно.Я использовал простой конструктор класса AWSSimpleSystemsManagementClient, что редко бывает правильным.
Лучший способ создать ваш клиент - это использовать класс AWSSimpleSystemsManagementClientBuilder, например:

AWSSimpleSystemsManagementClientBuilder.standard().build()
0 голосов
/ 25 апреля 2018

Могу я спросить, почему вы не используете встроенный подход AWS CodeBuild?Вы можете получить параметры из SSM через спецификацию сборки вашего AWS CodeBuild проекта.В этом случае дополнительный вызов через Java SDK устарел.

version: 0.2

env:
  parameter-store:
    key: "value"
    key: "value"

phases:
  build:
    commands:
      - command
      - command

хранилище параметров: требуется, если указан env, и вы хотите получить пользовательские переменные среды, хранящиеся в параметре Amazon EC2 Systems Manager.Хранить.Содержит сопоставление скаляров ключ / значение, где каждое сопоставление представляет отдельную переменную среды, хранящуюся в хранилище параметров Amazon EC2 Systems Manager.ключ - это имя, которое вы будете использовать позже в своих командах сборки для обращения к этой пользовательской переменной среды, а значение - это имя пользовательской переменной среды, хранящейся в хранилище параметров Amazon EC2 Systems Manager.

ПодробнееДля получения дополнительной информации, пожалуйста, ознакомьтесь с Справочником спецификации сборки для AWS CodeBuild

...