Crear una canalización en CodePipeline que use recursos de otra cuenta de AWS - AWS CodePipeline

Crear una canalización en CodePipeline que use recursos de otra cuenta de AWS

Puede ser conveniente crear una canalización que use recursos creados o administrados por otra cuenta de AWS. Por ejemplo, podría ser conveniente usar una cuenta para una canalización y otra para los recursos de CodeDeploy.

nota

Al crear una canalización con acciones de varias cuentas, debe configurar sus acciones para que puedan obtener acceso a los artefactos en las limitaciones de las canalizaciones entre cuentas. Las siguientes limitaciones se aplican a las acciones entre cuentas:

  • En general, una acción solo puede consumir un artefacto si:

    • La acción está en la misma cuenta que la cuenta de canalización, o

    • El artefacto se creó en la cuenta de la canalización para una acción en otra cuenta, o

    • El artefacto se produjo por una acción anterior en la misma cuenta que la acción

    En otras palabras, no puede pasar un artefacto de una cuenta a otra si ninguna de las dos cuentas es la de canalización.

  • No se admiten las acciones entre cuentas para los siguientes tipos de acción:

    • Acciones de compilación Jenkins

En este ejemplo, debe crear una clave de AWS Key Management Service (AWS KMS), añadirla a la canalización y configurar políticas y roles de cuenta que permitan el acceso entre las cuentas. Si se trata de una clave de AWS KMS, puede utilizar el ID de la clave, el ARN de la clave o el ARN del alias.

nota

Los alias se reconocen únicamente en la cuenta que ha creado la clave de KMS. Para las acciones entre cuentas, solo puede utilizar el ID de clave o un ARN de clave para identificar la clave. Las acciones entre cuentas implican el uso del rol de la otra cuenta (AccountB), por lo que al especificar el ID de clave se utilizará la clave de la otra cuenta (AccountB).

En esta guía y sus ejemplos, AccountA es la cuenta utilizada originalmente para crear la canalización. Tiene acceso al bucket de Amazon S3 empleado para almacenar artefactos de canalización y al rol de servicio que usa AWS CodePipeline. AccountB es la cuenta utilizada originalmente para crear la aplicación de CodeDeploy , el grupo de implementaciones y el rol de servicio empleado por CodeDeploy.

Para que AccountA pueda editar una canalización a fin de usar la aplicación de CodeDeploy creada por AccountB, AccountA debe hacer lo siguiente:

  • Solicitar el ARN o ID de cuenta de AccountB (en esta guía, el ID de AccountB es 012ID_ACCOUNT_B).

  • Crear o usar una clave de AWS KMS administrada por el cliente en la región de la canalización y conceder al rol de servicio (CodePipeline_Service_Role) y AccountB.

  • Crea una política de bucket de Amazon S3 que conceda a AccountB acceso al bucket de Amazon S3 (por ejemplo, codepipeline-us-east-2-1234567890).

  • Crear una política que permita a AccountA asumir un rol configurada por AccountB y asociar esa política al rol de servicio (CodePipeline_Service_Role).

  • Editar la canalización para que use la clave de AWS KMS administrada por el cliente en lugar de la clave predeterminada.

Para que AccountB permita el acceso a sus recursos a una canalización creada en AccountA, AccountB debe hacer lo siguiente:

  • Solicitar el ARN o ID de cuenta de AccountA (en esta guía, el ID de AccountA es 012ID_ACCOUNT_A).

  • Cree una política aplicada al rol de instancia de Amazon EC2 configurado para CodeDeploy que permita el acceso al bucket de Amazon S3 (codepipeline-us-east-2-1234567890).

  • Crear una política aplicada al rol de instancia de Amazon EC2 configurado para CodeDeploy que permita el acceso a la clave de AWS KMS administrada por el cliente que se utiliza para cifrar los artefactos de la canalización de AccountA.

  • Configurar y asociar un rol de IAM (CrossAccount_Role) con una política de relación de confianza que permita al rol de servicio de CodePipeline de AccountA asumir ese rol.

  • Crear una política que permita el acceso a los recursos de implementación que requiera la canalización y adjuntarla a CrossAccount_Role.

  • Crear una política que permita el acceso al bucket de Amazon S3 (codepipeline-us-east-2-1234567890) y asociarla a CrossAccount_Role.

Requisito previo: crear una clave de cifrado de AWS KMS

Las claves administradas por el cliente son específicas de cada región, tal y como ocurre con todas las claves de AWS KMS. Debe crear la clave de AWS KMS administrada por el cliente en la misma región donde se creó la canalización (por ejemplo, us-east-2).

Para crear una clave administrada por el cliente en AWS KMS
  1. Inicie sesión en la AWS Management Console con AccountA y abra la consola de AWS KMS.

  2. A la izquierda, seleccione Claves administradas por el cliente.

  3. Elija Create key. En la Configurar clave, deje el valor predeterminado Simétrico seleccionado y elija Siguiente.

  4. En Alias, escriba el alias que desea usar con esta clave (por ejemplo, Nombre-ClaveDeCanalización). Opcionalmente, proporcione una descripción y las etiquetas de esta clave; después, elija Paso siguiente.

  5. En Definir permisos de administración de claves, elija su usuario de y cualesquiera otros usuarios o grupos que desee que actúen como administradores de esta clave y, a continuación, elija Siguiente.

  6. En Definir permisos de uso de clave, bajo Esta cuenta, seleccione el nombre del rol de servicio para la canalización (por ejemplo, CodePipeline_Service_Role). En Otras cuentas de AWS), elija Añadir otra cuenta de AWS. Escriba el ID de AccountB para completar el ARN y elija Siguiente.

  7. En Revisar y editar política de claves, revise la política y, después, elija Terminar.

  8. En la lista de claves, elija el alias de la clave y copie su ARN (por ejemplo, arn:aws:kms:us-east-2:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE). Lo necesitará cuando edite la canalización y configure las políticas.

Paso 1: Configurar roles y políticas de cuenta

Una vez que haya creado la clave de AWS KMS, deberá crear y asociar políticas que permitan el acceso entre cuentas. Esto requiere acciones tanto desde AccountA como desde AccountB.

Configurar políticas y roles en la cuenta donde se va a crear la canalización (AccountA)

Para crear una canalización que utilice recursos de asociados a otra cuenta de AWS, AccountA debe configurar políticas tanto para el bucket de Amazon S3 utilizado para almacenar los artefactos como para el rol de servicio para CodePipeline.

Para crear una política para el bucket de Amazon S3 que concede acceso a AccountB (consola)
  1. Inicie sesión en la AWS Management Console con AccountA y abra la consola de Amazon S3 en https://console.aws.amazon.com/s3/.

  2. En la lista de buckets de Amazon S3, elija el bucket de Amazon S3 en el que se almacenan los artefactos para la canalización. Este bucket se denomina codepipeline-region-1234567EXAMPLE, donde region es la región de AWS en la que ha creado la canalización y 1234567EXAMPLE es un número aleatorio de diez dígitos que garantiza que el nombre del bucket es único (por ejemplo, codepipeline-us-east-2-1234567890).

  3. En la página de detalles del bucket de Amazon S3, elija Propiedades.

  4. En el panel de propiedades, expanda Permisos y después elija Añadir política de bucket.

    nota

    Si ya hay una política asociada al bucket de Amazon S3, elija Editar política de bucket. A continuación, puede añadir las instrucciones del siguiente ejemplo a la política. Para añadir una nueva política, elija el enlace y siga las instrucciones en el Generador de políticas de AWS. Para obtener más información, consulte Información general de las políticas de IAM.

  5. En la ventana Editor de políticas e bucket, escriba la siguiente política. Esto permitirá el acceso de AccountB a los artefactos de canalización y brindará a AccountB la posibilidad de añadir artefactos de salida si una acción, como una fuente personalizada o acción de compilación, los crea.

    En el siguiente ejemplo, el ARN de Cuenta B es 012ID_ACCOUNT_B. El ARN del bucket de Amazon S3 es codepipeline-us-east-2-1234567890. Sustituya estos ARN con el ARN de la cuenta a la que desea permitir el acceso y el ARN del bucket de Amazon S3:

    { "Version": "2012-10-17", "Id": "SSEAndSSLPolicy", "Statement": [ { "Sid": "DenyUnEncryptedObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890/*", "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "aws:kms" } } }, { "Sid": "DenyInsecureConnections", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890/*", "Condition": { "Bool": { "aws:SecureTransport": false } } }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::012ID_ACCOUNT_B:root" }, "Action": [ "s3:Get*", "s3:Put*" ], "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890/*" }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::012ID_ACCOUNT_B:root" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890" } ] }
  6. Elija Guardar y, a continuación, cierre el editor de políticas.

  7. Elija Guardar para guardar los permisos para el bucket de Amazon S3.

Para crear una política para el rol de servicio de CodePipeline (consola)
  1. Inicie sesión en la AWS Management Console y abra con AccountA y abra la consola de IAM en https://console.aws.amazon.com/iam/.

  2. Seleccione Roles en el panel de navegación.

  3. En la lista de roles, bajo Nombre de ro), elija el nombre del rol de servicio para CodePipeline.

  4. En la pestaña Permisos, elija Añadir política en línea.

  5. Seleccione la pestaña JSON e introduzca la siguiente política para permitir que AccountB asuma el rol. En el siguiente ejemplo, 012ID_ACCOUNT_B es el ARN de AccountB:

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::012ID_ACCOUNT_B:role/*" ] } }
  6. Elija Revisar política.

  7. En Name (Nombre), introduzca un nombre para esta política. Elija Crear política.

Configurar políticas y roles en la cuenta a la que pertenece el recurso de AWS (AccountB)

Al crear una aplicación, una implementación y un grupo de implementaciones en CodeDeploy, también crea un rol de instancia de Amazon EC2. (Este rol se crea automáticamente cuando se usa el asistente para ejecutar la implementación, pero también puede crearlo manualmente). Para que una canalización creada en AccountA use recursos de CodeDeploy creados en AccountB, debe hacer lo siguiente:

  • Configurar una política para el rol de instancia que le permita el acceso al bucket de Amazon S3 donde se almacenan los artefactos de la canalización.

  • Crear un segundo rol en AccountB configurado para el acceso entre cuentas.

    Este segundo rol no solo debe tener acceso al bucket de Amazon S3 de AccountA, sino que también debe contener una política que permita el acceso a los recursos de CodeDeploy y una política de relación de confianza que permita al rol de servicio de CodePipeline de AccountA asumir ese rol.

    nota

    Estas políticas son específicas de la configuración de los recursos de CodeDeploy para su uso en una canalización creada desde una cuenta de AWS distinta. Otros recursos de AWS requerirán políticas específicas para sus necesidades de recursos.

Para crear una política para el rol de instancia de Amazon EC2 configurada para CodeDeploy (consola)
  1. Inicie sesión en la AWS Management Console con AccountB y abra la consola de IAM en https://console.aws.amazon.com/iam/.

  2. Seleccione Roles en el panel de navegación.

  3. En la lista de roles, en Nombre de rol, elija el nombre del rol de servicio usada como función de instancia de Amazon EC2 para la aplicación de CodeDeploy. El nombre de este rol puede variar, y un grupo de implementaciones puede usar más de un rol de instancia. Para obtener más información, consulte Crear un perfil de instancia de IAM para sus instancias de Amazon EC2.

  4. En la pestaña Permisos, elija Añadir política en línea.

  5. Seleccione la pestaña JSON e introduzca la siguiente política para conceder acceso al bucket de Amazon S3 que AccountA usa para almacenar artefactos para canalizaciones (en este ejemplo, codepipeline-us-east-2-1234567890):

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*" ], "Resource": [ "arn:aws:s3:::codepipeline-us-east-2-1234567890/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::codepipeline-us-east-2-1234567890" ] } ] }
  6. Elija Revisar política.

  7. En Name (Nombre), introduzca un nombre para esta política. Elija Crear política.

  8. Cree una segunda política para AWS KMS, donde arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE es el ARN de la clave administrada por el cliente que se ha creado en AccountA y que está configurada para permitir que AccountB la use:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:DescribeKey", "kms:GenerateDataKey*", "kms:Encrypt", "kms:ReEncrypt*", "kms:Decrypt" ], "Resource": [ "arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE" ] } ] }
    importante

    En esta política, debe usar el ID de cuenta de AccountA como parte del ARN de recursos para la clave de AWS KMS, como se muestra aquí, o la política no funcionará.

  9. Elija Revisar política.

  10. En Name (Nombre), introduzca un nombre para esta política. Elija Crear política.

Ahora debe crear un rol de IAM para el acceso entre cuentas y configurarlo de modo que el rol de servicio de CodePipeline de AccountA pueda asumir ese rol. Este rol debe contener políticas que permitan el acceso a los recursos de CodeDeploy y al bucket de Amazon S3 utilizado para almacenar los artefactos en AccountA.

Para configurar el rol de acceso entre cuentas en IAM
  1. Inicie sesión en la AWS Management Console con AccountB y abra la consola de IAM en https://console.aws.amazon.com/iam.

  2. Seleccione Roles en el panel de navegación. Elija Crear rol.

  3. En Seleccione el tipo de entidad de confianza, elija Otra cuenta de AWS). En Especificar las cuentas que pueden usar este rol, en ID de cuenta, introduzca el ID de cuenta de AWS de la cuenta que creará la canalización en CodePipeline (AccountA) y, a continuación, seleccione Siguiente: permisos.

    importante

    Este paso crea la política de relación de confianza entre AccountB y AccountA. Sin embargo, esto otorga acceso de nivel raíz a la cuenta, y CodePipeline recomienda limitarlo al rol de servicio de CodePipeline de AccountA. Siga el paso 16 para restringir los permisos.

  4. En la página Asociar políticas de permisos, elija AmazonS3ReadOnlyAccess y Siguiente: etiquetas.

    nota

    Esta no es la política que usará. Debe elegir una política para completar el asistente.

  5. Elija Siguiente: Revisar. Escriba un nombre para este rol en Nombre de rol (por ejemplo, CrossAccount_Role). Puede dar a este rol el nombre que desee, siempre y cuando siga las convenciones de nomenclatura de IAM. Considere dar al rol un nombre que indique claramente su finalidad. Elija Crear rol.

  6. En la lista de roles, elija el rol que acaba de crear (por ejemplo, CrossAccount_Role) para abrir la página Resumen de ese rol.

  7. En la pestaña Permisos, elija Añadir política en línea.

  8. Seleccione la pestaña JSON e introduzca la siguiente política para permitir el acceso a los recursos de CodeDeploy:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codedeploy:CreateDeployment", "codedeploy:GetDeployment", "codedeploy:GetDeploymentConfig", "codedeploy:GetApplicationRevision", "codedeploy:RegisterApplicationRevision" ], "Resource": "*" } ] }
  9. Elija Revisar política.

  10. En Name (Nombre), introduzca un nombre para esta política. Elija Crear política.

  11. En la pestaña Permisos, elija Añadir política en línea.

  12. Elija la pestaña JSON, e introduzca la siguiente política para que este rol recupere artefactos de entrada e introduzca los artefactos de salida en el bucket de Amazon S3 en AccountA:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject*", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::codepipeline-us-east-2-1234567890/*" ] } ] }
  13. Elija Revisar política.

  14. En Name (Nombre), introduzca un nombre para esta política. Elija Crear política.

  15. En la pestaña Permisos, busque Amazons3ReadOnlyAccess en la lista de políticas en Nombre de política y seleccione el icono de eliminación (X) situado junto a la política. Cuando se le pregunte, elija Separar.

  16. Seleccione la pestaña Relación de confianza y, a continuación, Editar la política de confianza. Seleccione la opción Agregar una entidad principal en la columna de la izquierda. En Tipo de entidad principal, elija Roles de IAM y, a continuación, proporcione el ARN para el rol de servicio de CodePipeline de AccountA. Elimine arn:aws:iam::Account_A:root de la lista de Entidades principales de AWS y, a continuación, seleccione Actualizar la política.

Paso 2: Editar la canalización

No es posible utilizar la consola de CodePipeline para crear o editar una canalización que use recursos asociados a otra cuenta de AWS. Sin embargo, puede usar la consola para crear la estructura general de la canalización y entonces usar la AWS CLI para editarla y agregar los recursos. Como alternativa, puede usar la estructura de una canalización existente y agregarle los recursos manualmente.

Para añadir los recursos asociados a otra cuenta de AWS (AWS CLI)
  1. En un terminal (Linux, macOS o Unix) o el símbolo del sistema (Windows), ejecute el comando get-pipeline para la canalización a la que desea añadir recursos. Copie el resultado del comando a un archivo JSON. Por ejemplo, para una canalización denominada MyFirstPipeline, debería escribir un texto similar al siguiente:

    aws codepipeline get-pipeline --name MyFirstPipeline >pipeline.json

    El resultado se envía al archivo pipeline.json.

  2. Abra el archivo JSON en cualquier editor de texto sin formato. Después de "type": "S3" en el almacén de artefactos, añada la clave de cifrado de KMS, el ID y el tipo de la información, donde codepipeline-us-east-2-1234567890 es el nombre del bucket de Amazon S3 usado para almacenar los artefactos de la canalización y arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE es el ARN de la clave administrada por el cliente que acaba de crear:

    { "artifactStore”: { "location": "codepipeline-us-east-2-1234567890", "type": "S3", "encryptionKey": { "id": "arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE", "type": "KMS" } },
  3. Añada una acción de implementación en una etapa para usar los recursos de asociados a AccountB, incluidos los valores de roleArn de la función entre cuentas que ha creado (CrossAccount_Role).

    En el siguiente ejemplo se muestra JSON que añade una acción de implementación denominada ExternalDeploy. Usa los recursos de CodeDeploy creados en AccountB en una etapa denominada Ensayo. En el siguiente ejemplo, el ARN de AccountB es 012ID_ACCOUNT_B:

    , { "name": "Staging", "actions": [ { "inputArtifacts": [ { "name": "MyAppBuild" } ], "name": "ExternalDeploy", "actionTypeId": { "category": "Deploy", "owner": "AWS", "version": "1", "provider": "CodeDeploy" }, "outputArtifacts": [], "configuration": { "ApplicationName": "AccountBApplicationName", "DeploymentGroupName": "AccountBApplicationGroupName" }, "runOrder": 1, "roleArn": "arn:aws:iam::012ID_ACCOUNT_B:role/CrossAccount_Role" } ] }
    nota

    Este no es el JSON para toda la canalización, sino solo la estructura de la acción en una etapa.

  4. Debe eliminar las líneas metadata del archivo para que el comando update-pipeline pueda utilizarlo. Quite la sección de la estructura de canalizaciones del archivo JSON (las líneas "metadata": { } y los campos "created", "pipelineARN" y "updated" que contenga).

    Por ejemplo, quite las siguientes líneas de la estructura:

    "metadata": { "pipelineArn": "arn:aws:codepipeline:region:account-ID:pipeline-name", "created": "date", "updated": "date" }

    Guarde el archivo.

  5. Para aplicar los cambios, ejecute el comando update-pipeline, especificando el archivo JSON de la canalización, de forma similar a como se muestra a continuación:

    importante

    Asegúrese de incluir file:// antes del nombre de archivo. Es obligatorio en este comando.

    aws codepipeline update-pipeline --cli-input-json file://pipeline.json

    Este comando devuelve la estructura completa de la canalización editada.

Para probar la canalización que usa los recursos asociados con otra cuenta de AWS
  1. En un terminal (Linux, macOS o Unix) o el símbolo del sistema (Windows), ejecute el comando start-pipeline-execution, especificando el nombre de la canalización, de un modo similar al siguiente:

    aws codepipeline start-pipeline-execution --name MyFirstPipeline

    Para obtener más información, consulte Iniciar la canalización manualmente.

  2. Inicie sesión en la AWS Management Console con AccountA y abra la consola de CodePipeline en http://console.aws.amazon.com/codesuite/codepipeline/home.

    Se muestran los nombres de todas las canalizaciones asociadas con su cuenta de AWS.

  3. En Name, elija el nombre de la canalización que acaba de editar. Esto abre una vista detallada de la canalización, que incluye el estado de cada acción en cada etapa de la canalización.

  4. Vea el progreso en la canalización. Espere a que aparezca un mensaje de confirmación para la acción que usa el recurso asociado con otra cuenta de AWS.

    nota

    Recibirá un error si intenta ver los detalles de la acción habiendo iniciado sesión con AccountA. Cierre la sesión y después inicie sesión con AccountB para ver los detalles de la implementación en CodeDeploy.