Ejemplo de Amazon ECR para CodeBuild - AWS CodeBuild

Ejemplo de Amazon ECR para CodeBuild

En este ejemplo, se utiliza una imagen de Docker en un repositorio de imágenes Amazon Elastic Container Registry (Amazon ECR) para compilar un proyecto de Go de ejemplo.

importante

La ejecución de este ejemplo puede producir cargos en su cuenta de AWS. Estos incluyen posibles cargos por AWS CodeBuild y por acciones y recursos de AWS relacionados con Amazon S3, AWS KMS, Registros de CloudWatch y Amazon ECR. Para obtener más información, consulte Precios de CodeBuild, Precios de Amazon S3, Precios de AWS Key Management Service, Precios de Amazon CloudWatch y Precios de Amazon Elastic Container Registry.

Ejecución del ejemplo de Amazon ECR

Siga las instrucciones a continuación a fin de ejecutar el ejemplo de Amazon ECR para CodeBuild.

Para ejecutar este ejemplo
  1. Para crear e insertar la imagen de Docker en su repositorio de imágenes de Amazon ECR, siga los pasos que se indican en la sección Ejecución del ejemplo de publicación de una imagen de Docker en Amazon ECR de Ejemplo de publicación de una imagen de Docker en Amazon ECR.

  2. Crear un proyecto de Go:

    1. Cree los archivos tal y como se describe en las secciones Estructura de un proyecto de Go y Archivos de un proyecto de Go de este tema y cárguelos en un bucket de entrada de S3 o en un repositorio de AWS CodeCommit, GitHub o Bitbucket.

      importante

      No cargue (root directory name), solo los archivos incluidos en (root directory name).

      Si utiliza un bucket de entrada de S3, no olvide crear un archivo ZIP que contenga los archivos y cárguelo en el bucket de entrada. No añada (root directory name) al archivo ZIP, solo los archivos incluidos en (root directory name).

    2. Cree un proyecto de compilación, ejecute la compilación y vea la información de compilación relacionada.

      Si usa la AWS CLI para crear el proyecto de compilación, es posible que el resultado con formato JSON del comando create-project tenga un aspecto similar al siguiente. (Sustituya los marcadores de posición por sus propios valores).

      { "name": "sample-go-project", "source": { "type": "S3", "location": "codebuild-region-ID-account-ID-input-bucket/GoSample.zip" }, "artifacts": { "type": "S3", "location": "codebuild-region-ID-account-ID-output-bucket", "packaging": "ZIP", "name": "GoOutputArtifact.zip" }, "environment": { "type": "LINUX_CONTAINER", "image": "aws/codebuild/standard:5.0", "computeType": "BUILD_GENERAL1_SMALL" }, "serviceRole": "arn:aws:iam::account-ID:role/role-name", "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID" }
    3. Para obtener el artefacto de salida de la compilación, abra el bucket de salida de S3.

    4. Descargue el archivo GoOutputArtifact.zip en su equipo o instancia local y después extraiga el contenido del archivo . En el contenido extraído, obtenga el archivo hello.

  3. Si se cumple una de las siguientes condiciones, debe añadir permisos al repositorio de imágenes de para que AWS CodeBuild pueda incluir su imagen de Docker en el entorno de compilación.

    • Su proyecto utiliza credenciales de CodeBuild para extraer imágenes de Amazon ECR. Esto se especifica mediante el valor CODEBUILD del atributo imagePullCredentialsType de ProjectEnvironment.

    • Su proyecto utiliza una imagen de Amazon ECR entre más de una cuenta. En este caso, el proyecto debe utilizar su rol de servicio para extraer imágenes de Amazon ECR. Para habilitar este comportamiento, establezca el atributo imagePullCredentialsType de ProjectEnvironment en SERVICE_ROLE.

    1. Abra la consola de Amazon ECR en https://console.aws.amazon.com/ecr/.

    2. En la lista de nombres de repositorio, elija el nombre del repositorio que ha creado o seleccionado.

    3. En el panel de navegación, elija Permissions (Permisos), Edit (Editar) y Add statement (Agregar instrucción).

    4. En Statement name (Nombre de instrucción), introduzca un identificador (por ejemplo, CodeBuildAccess).

    5. En Effect (Efecto), deje seleccionado Allow (Permitir). Esto indica que desea permitir el acceso a otra cuenta de AWS.

    6. En Principal, realice una de las siguientes acciones:

      • Si el proyecto utiliza credenciales de CodeBuild para extraer una imagen de Amazon ECR, en Entidad principal del servicio, introduzca codebuild.amazonaws.com.

      • Si el proyecto utiliza una imagen de Amazon ECR entre cuentas, en ID de cuentas de AWS introduzca los ID de las cuentas de AWS a las que desee dar acceso.

    7. Omita la lista Todas las entidades de IAM.

    8. En Acción, seleccione las acciones de solo extracción ecr:GetDownloadUrlForLayer, ecr:BatchGetImage y ecr:BatchCheckLayerAvailability.

    9. En Condiciones, añada lo siguiente:

      { "StringEquals":{ "aws:SourceAccount":"<AWS-account-ID>", "aws:SourceArn":"arn:aws:codebuild:<region>:<AWS-account-ID>:project/<project-name>" } }
    10. Seleccione Guardar.

      Esta política aparece en Permisos. La entidad principal es la especificada en Entidad principal en el paso 3 de este procedimiento:

      • Si el proyecto utiliza credenciales de CodeBuild para extraer una imagen de Amazon ECR, se muestra "codebuild.amazonaws.com" en Entidad principal del servicio.

      • Si el proyecto utiliza una imagen de Amazon ECR entre cuentas, el ID de la cuenta de AWS a la que desee dar acceso se muestra en ID de cuentas de AWS.

        La siguiente política de ejemplo utiliza credenciales de CodeBuild y una imagen de Amazon ECR entre cuentas.

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Sid": "CodeBuildAccessPrincipal", "Effect": "Allow", "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:codebuild:us-east-1:111122223333:project/MyProject", "aws:SourceAccount": "111122223333" } } }, { "Sid": "CodeBuildAccessCrossAccount", "Effect": "Allow", "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ], "Resource": "*" } ] }
      • Si sus proyectos utilizan credenciales de CodeBuild y desea que sus proyectos de CodeBuild tengan acceso abierto al repositorio de Amazon ECR, puede omitir las claves de Condition y añadir la siguiente política de ejemplo.

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Sid": "CodeBuildAccessPrincipal", "Effect": "Allow", "Resource": [ "arn:aws:codecommit:us-east-2:111122223333:MySharedDemoRepo" ], "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ] }, { "Sid": "CodeBuildAccessCrossAccount", "Effect": "Allow", "Resource": [ "arn:aws:codecommit:us-east-2:111122223333:MySharedDemoRepo" ], "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability" ] } ] }
  4. Cree un proyecto de compilación, ejecute la compilación y vea la información de compilación.

    Si usa la AWS CLI para crear el proyecto de compilación, es posible que el resultado con formato JSON del comando create-project tenga un aspecto similar al siguiente. (Sustituya los marcadores de posición por sus propios valores).

    { "name": "amazon-ecr-sample-project", "source": { "type": "S3", "location": "codebuild-region-ID-account-ID-input-bucket/GoSample.zip" }, "artifacts": { "type": "S3", "location": "codebuild-region-ID-account-ID-output-bucket", "packaging": "ZIP", "name": "GoOutputArtifact.zip" }, "environment": { "type": "LINUX_CONTAINER", "image": "account-ID.dkr.ecr.region-ID.amazonaws.com/your-Amazon-ECR-repo-name:tag", "computeType": "BUILD_GENERAL1_SMALL" }, "serviceRole": "arn:aws:iam::account-ID:role/role-name", "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID" }
  5. Para obtener el artefacto de salida de la compilación, abra el bucket de salida de S3.

  6. Descargue el archivo GoOutputArtifact.zip en su equipo o instancia local y después extraiga el contenido del archivo GoOutputArtifact.zip. En el contenido extraído, obtenga el archivo hello.

Estructura de un proyecto de Go

En este ejemplo se presupone que existe esta estructura de directorios.

(root directory name) ├── buildspec.yml └── hello.go

Archivos de un proyecto de Go

Este ejemplo usa los siguientes archivos.

buildspec.yml (en (root directory name))

version: 0.2 phases: install: runtime-versions: golang: 1.13 build: commands: - echo Build started on `date` - echo Compiling the Go code - go build hello.go post_build: commands: - echo Build completed on `date` artifacts: files: - hello

hello.go (en (root directory name))

package main import "fmt" func main() { fmt.Println("hello world") fmt.Println("1+1 =", 1+1) fmt.Println("7.0/3.0 =", 7.0/3.0) fmt.Println(true && false) fmt.Println(true || false) fmt.Println(!true) }