Actualmente estoy usando codebuild con éxito para tareas de compilación simples (en una configuración sin vpc).
Pero ahora estoy tratando de ejecutar una tarea de compilación que lee un valor de parámetro de SSM, y está fallando porque no puede cargar ninguna credencial, la causa aparente es:
com.amazonaws.auth.InstanceProfileCredentialsProvider@5754b242: Unable to load credentials from service endpoint El rol de servicio de IAM que asigné al proyecto de creación de código tiene el permiso ssm:GetParameters para el parámetro que intento leer (y si ese fuera el problema, esperaría ver un mensaje unauthorized , en lugar de unable to load credentials ).
Estoy usando el SDK de Java para realizar la llamada GetParameter de SSM, que he confirmado que funciona para leer los parámetros de SSM cuando se ejecuta desde una instancia de EC2, por lo que estoy bastante seguro de que el problema aquí es Codebuild.
Para diagnosticar aún más el problema, intenté agregar un comando de compilación para hacer un curl en la dirección de metadatos de la instancia de AWS:
curl 169.254.169.254/latest/meta-data/iam/infoEn lugar de devolver los metadatos de la instancia como lo haría desde un entorno EC2 normal, simplemente se agota el tiempo de espera.
Entonces, parece que la raíz del problema es que el entorno de creación de código no funciona con la dirección de búsqueda de metadatos de AWS, lo que hace que la cadena de proveedores de AWS no pueda buscar las credenciales.
¿Cómo puedo leer mis parámetros de SSM desde la creación de código (sin codificar o usar variables de entorno para las credenciales de SDK)?
¿Puedo preguntarle por qué no utiliza el enfoque integrado de AWS CodeBuild ? Puede obtener parámetros de SSM a través de la especificación de compilación de su proyecto de AWS CodeBuild . La llamada adicional a través del SDK de Java está obsoleta en este caso.
version: 0.2 env: parameter-store: key: "value" key: "value" phases: build: commands: - command - commandalmacén de parámetros: obligatorio si se especifica env y desea recuperar variables de entorno personalizadas almacenadas en el almacén de parámetros de Amazon EC2 Systems Manager. Contiene una asignación de escalares clave/valor, donde cada asignación representa una única variable de entorno personalizada almacenada en el almacén de parámetros de Amazon EC2 Systems Manager. key es el nombre que usará más adelante en sus comandos de compilación para hacer referencia a esta variable de entorno personalizada, y value es el nombre de la variable de entorno personalizada almacenada en el almacén de parámetros de Amazon EC2 Systems Manager.
Para obtener más información, consulte la Referencia de especificación de compilación para AWS CodeBuild
La respuesta de MaiKaY es la mejor solución al problema de "cómo obtener valores de parámetros SSM en su compilación" (es mejor que la especificación de compilación esté vinculada al nombre del parámetro SSM en lugar del código o los scripts de compilación).
Pero en caso de que alguien más se tope con esta pregunta mientras se enfrenta al mismo problema, el problema estaba en el código subyacente de la pregunta inicial, algo relacionado con la respuesta de Clare Liguori .
Estaba usando un SDK de AWS reciente, pero no lo estaba usando de la manera correcta. Estaba usando un constructor simple de la clase AWSSimpleSystemsManagementClient , que rara vez es lo correcto.
La mejor manera de construir su cliente es usar la clase AWSSimpleSystemsManagementClientBuilder , como:
AWSSimpleSystemsManagementClientBuilder.standard().build()Agregando a la respuesta de MaiKaY , asegúrese de que el parámetro en el almacén de parámetros ssm esté en formato de cadena segura y NO en cadena . Luché con esto durante días y finalmente agregué variables mediante Codebuild console que se almacena automáticamente en secureString