¿Cómo puedo implementar artefactos en Amazon S3 en otra cuenta de AWS mediante CodePipeline?

12 minutos de lectura
0

Quiero implementar artefactos en un bucket de Amazon Simple Storage Service (Amazon S3) en una cuenta diferente. También quiero establecer la cuenta de destino como propietaria del objeto mediante AWS CodePipeline con un proveedor de acciones de implementación de Amazon S3.

Solución

Nota: El siguiente procedimiento de ejemplo supone lo siguiente:

  • Tienes dos cuentas: una cuenta de desarrollo y una cuenta de producción.
  • El bucket de entrada de la cuenta de desarrollo se denomina codepipeline-input-bucket (con el control de versiones activado).
  • El bucket de artefactos predeterminado de la cuenta de desarrollo se denomina codepipeline-us-east-1-0123456789.
  • El bucket de salida de la cuenta de producción se denomina codepipeline-output-bucket.
  • Estás implementando artefactos de la cuenta de desarrollo en un bucket de S3 de la cuenta de producción.
  • Estás asumiendo un rol multicuenta creado en la cuenta de producción para desplegar los artefactos. La función convierte a la cuenta de producción en propietaria del objeto en lugar de la cuenta de desarrollo. Para proporcionar al propietario del bucket de la cuenta de producción acceso a los objetos que pertenecen a la cuenta de desarrollo, consulta el artículo siguiente:¿Cómo puedo implementar artefactos en Amazon S3 en otra cuenta de AWS mediante CodePipeline y una ACL predefinida?

Creación de una clave de AWS KMS para usarla con CodePipeline en la cuenta de desarrollo

Importante: Debes utilizar la clave administrada por el cliente de AWS Key Management Service (AWS KMS) para los despliegues entre cuentas. Si la clave no está configurada, CodePipeline cifra los objetos con el cifrado predeterminado, que el rol no puede descifrar en la cuenta de destino.

1.    Abre la consola de AWS KMS en la cuenta de desarrollo.

2.    En el panel de navegación, elige Claves administradas por el cliente.

3.    Elige Crear clave.

4.    En Tipo de clave, elige Clave simétrica.

5.    Amplía las opciones avanzadas.

6.    En Origen del material de claves, elige KMS. A continuación, selecciona Siguiente.

7.    En Alias, introduce el alias de la clave. Por ejemplo: s3deploykey.

8.    Elige Siguiente. Se abre la página Definir permisos de administración de claves.

9.    En la sección Administradores de claves, selecciona un usuario o rol de AWS Identity and Access Management (IAM) como administrador de claves.

10. Selecciona Siguiente. Se abre la página Definir permisos de uso de claves.

11.    En la sección Otras cuentas de AWS, selecciona Añadir otra cuenta de AWS.

12.    En el cuadro de texto que aparece, añade el ID de cuenta de la cuenta de producción. A continuación, selecciona Siguiente.

**Nota:**También puedes seleccionar un rol de servicio existente en la sección Esta cuenta. Si seleccionas un rol de servicio existente, omite los pasos de la sección Actualiza la política de uso de KMS de la cuenta de desarrollo.

13.    Revisa la política de claves. A continuación, selecciona Finalizar.

Crea un CodePipeline en la cuenta de desarrollo

1.    Abre la consola de CodePipeline. A continuación, selecciona Crear canalización.

2.    En Nombre de canalización, introduce un nombre para tu canalización. Por ejemplo: crossaccountdeploy.

**Nota:**El cuadro de texto del nombre del rol se rellena automáticamente con el nombre del rol de servicio AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy. También puedes elegir otro rol de servicio existente con acceso a la clave de KMS.

3.    Amplía la sección Configuración avanzada.

4.    Para Almacén de artefactos, selecciona Ubicación predeterminada.
Nota: Puedes seleccionar una ubicación personalizada si es necesario para tu caso de uso.

5.    Para la clave de cifrado, selecciona Clave administrada por el cliente.

6.    Para la clave administrada por el cliente de KMS, selecciona el alias de tu clave en la lista (s3deploykey, por ejemplo). A continuación, elige Siguiente. Se abre la página Agregar la etapa de origen.

7. En Proveedor de origen, selecciona Amazon S3.

8.    En Bucket, introduce el nombre de tu bucket S3 de entrada de desarrollo. Por ejemplo: codepipeline-input-bucket.

**Importante:**El bucket de entrada debe tener activado el control de versiones para funcionar con CodePipeline.

9.    Para la clave de objeto S3, escribe sample-website.zip.

Importante: Para utilizar un ejemplo de sitio web de AWS en lugar de tu propio sitio web, consulta Tutorial: Create a pipeline that uses Amazon S3 as a deployment provider (Tutorial: Creación de una canalización que utilice Amazon S3 como proveedor de implementación). A continuación, busca «ejemplo de sitio web estático» en los requisitos previos de la sección 1: Implementa archivos de sitios web estáticos en la sección Amazon S3.

10.    En Cambiar las opciones de detección, elige Eventos de Amazon CloudWatch (recomendado). A continuación, selecciona Siguiente.

11.    En la página Añadir la etapa de compilación, selecciona Omitir la etapa de compilación. A continuación, selecciona Omitir.

12.    En la página Añadir la etapa de despliegue, para el proveedor de despliegue, elige Amazon S3.

13.    Para la región, elige la región de AWS en la que se encuentra tu bucket S3 de salida de producción. Por ejemplo: Este de EE. UU. (Norte de Virginia).

Importante: Si la región del bucket de salida de producción es diferente a la región de su canalización, también debes comprobar lo siguiente:

14.    En Bucket, introduce el nombre del bucket S3 de salida de producción. Por ejemplo: codepipeline-output-bucket.

15.    Selecciona la casilla Extraer el archivo antes del despliegue.
Nota: Si es necesario, introduce una ruta para la ruta de despliegue.

16.    Elige Siguiente.

17.    Elige Crear canalización. La canalización se ejecuta, pero se produce un error en la etapa de origen. Aparece el siguiente error: «El objeto con la clave “sample-website.zip” no existe».

En la sección Carga el sitio web de muestra al bucket de entrada de este artículo se describe cómo resolver este error.

Actualización de la política de uso de KMS de la cuenta de desarrollo

Importante: Omite esta sección si utilizas un rol de servicio de CodePipeline existente.

1.    Abre la consola de AWS KMS en la cuenta de desarrollo.

2.    Selecciona el alias de tu clave (s3deploykey, por ejemplo).

3.    En la sección Usuarios de claves, selecciona Añadir.

4.    En el cuadro de búsqueda, introduce el rol de servicio AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy.

5.    Selecciona Añadir.

Configuración de un rol multicuenta en la cuenta de producción

Crea una política de IAM para el rol que otorga permisos de Amazon S3 a tu bucket S3 de salida de producción

1.    Abre la consola de IAM en la cuenta de producción.

2.    En el panel de navegación, elige Políticas. A continuación, elige Crear política.

3.    Elige la pestaña JSON. A continuación, introduce la siguiente política en el editor JSON:

Importante: Reemplaza codepipeline-output-bucket por el nombre del bucket de S3 de tu salida de producción.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Put*"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-output-bucket/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-output-bucket"
      ]
    }
  ]
}

4.    Elige Revisar la política.

5.    En Nombre, introduce un nombre para la política. Por ejemplo: outputbucketdeployaccess.

6.    Elige Crear política.

Crea una política de IAM para el rol que otorgue los permisos de KMS requeridos

1.    En la consola de IAM, selecciona Crear política.

2.    Elige la pestaña JSON. A continuación, introduce la siguiente política en el editor JSON:

Nota: Reemplaza el ARN de la clave de KMS que creaste. Sustituye codepipeline-us-east-1-0123456789 por el nombre del bucket de artefactos en la cuenta de desarrollo.

{
  "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:<dev-account-id>:key/<key id>"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-us-east-1-0123456789/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-us-east-1-0123456789"
      ]
    }
  ]
}

3.    Elige Revisar la política.

4.    En Nombre, introduce un nombre para la política. Por ejemplo: devkmss3access.

5.    Elige Crear política.

Crea una función entre cuentas que la cuenta de desarrollo pueda asumir para desplegar los artefactos

1.    Abre la consola de IAM en la cuenta de producción.

2.    En el panel de navegación, selecciona Roles. A continuación, selecciona Crear rol.

3.    Elige Otra cuenta de AWS.

4.    Para el ID de cuenta, introduce el ID de cuenta de AWS de la cuenta de desarrollo.

5.    Elige Siguiente: Permisos.

6.    En la lista de políticas, selecciona outputbucketdeployaccess y devkmss3access.

7.    Elige Siguiente: Etiquetas.

8.    (Opcional) Añade etiquetas y, a continuación, selecciona Siguiente: Revisar.

9.    En Nombre de rol, escribe prods3role.

10.    Elige Crear rol.

11.    En la lista de roles, selecciona prods3role.

12.    Elige la relación de confianza. A continuación, selecciona Editar la relación de confianza.

13.    En el editor de documentos de políticas, introduce la siguiente política:

Importante: Sustituye dev-account-id por el ID de cuenta de AWS de tu cuenta de desarrollo. Sustituye AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy por el nombre del rol de servicio de tu canalización.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::<dev-account-id>:role/service-role/AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy"
        ]
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}

14.    Selecciona Actualizar la política de confianza.

Actualización de la política de bucket para el bucket de artefactos de CodePipeline en la cuenta de desarrollo

1.    Abre la consola de Amazon S3 en la cuenta de desarrollo.

2.    En la lista de nombres de buckets, elige el nombre de tu bucket de artefactos en tu cuenta de desarrollo (por ejemplo, codepipeline-us-east-1-0123456789).

3.    Selecciona Permisos. A continuación, elige Política de bucket.

4.    En el editor de texto, actualiza la política actual para incluir las siguientes declaraciones de políticas:

Importante: Para alinearte con el formato JSON adecuado, añade una coma después de las sentencias existentes. Sustituye prod-account-id por el ID de cuenta de AWS de tu cuenta de producción. Sustituye codepipeline-us-east-1-0123456789 por el nombre de tu bucket de artefactos.

{
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::<prod-account-id>:root"
    },
    "Action": [
        "s3:Get*",
        "s3:Put*"
    ],
    "Resource": "arn:aws:s3:::codepipeline-us-east-1-0123456789/*"
},
{
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::<prod-account-id>:root"
    },
    "Action": "s3:ListBucket",
    "Resource": "arn:aws:s3:::codepipeline-us-east-1-0123456789"
}

5.    Selecciona Guardar.

Adjunta una política a tu rol de servicio de CodePipeline en la cuenta de desarrollo que te permita asumir la función multicuenta que creaste

1.    Abre la consola de IAM en la cuenta de desarrollo.

2.    En el panel de navegación, elige Políticas. A continuación, elige Crear política.

3.    Elige la pestaña JSON. A continuación, introduce la siguiente política en el editor JSON:

Importante: Sustituye prod-account-id por el ID de cuenta de AWS de tu cuenta de producción.

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": [
      "arn:aws:iam::<prod-account-id>:role/prods3role"
    ]
  }
}

4.    Elige Revisar la política.

5.    En Nombre, escribe assumeprods3role.

6.    Elige Crear política.

7.    En el panel de navegación, selecciona Roles. A continuación, elige el nombre del rol de servicio para tu canalización (por ejemplo, AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy).

8.    Elige Adjuntar políticas. A continuación, selecciona assumeprods3role.

9.    Elige Adjuntar política.

Actualización de tu canalización para usar la función multicuenta en la cuenta de desarrollo

Nota: Si recibes errores al ejecutar los comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), asegúrate de utilizar la versión más reciente de AWS CLI.

1.    Recupera la definición de canalización como un archivo denominado codepipeline.json mediante la ejecución del siguiente comando de AWS CLI:

Importante: Reemplaza crossaccountdeploy por el nombre de tu canalización.

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

2.    Añade el ARN del rol de IAM entre cuentas (roleArn) a la sección de acciones de implementación del archivo codepipeline.json. Para obtener más información, consulta la referencia de la estructura de canalizaciones de CodePipeline en la Guía del usuario de CodePipeline.

Ejemplo de roleArn de IAM multicuenta

"roleArn": "arn:aws:iam::your-prod-account id:role/prods3role",

Ejemplo de acción de implementación que incluye un ARN de rol de IAM para varias cuentas

Importante: Sustituye el prod-account-id por el ID de cuenta de AWS de tu cuenta de producción.

{
  "name": "Deploy",
  "actions": [
    {
      "name": "Deploy",
      "actionTypeId": {
        "category": "Deploy",
        "owner": "AWS",
        "provider": "S3",
        "version": "1"
      },
      "runOrder": 1,
      "configuration": {
        "BucketName": "codepipeline-output-bucket",
        "Extract": "true"
      },
      "outputArtifacts": [],
      "inputArtifacts": [
        {
          "name": "SourceArtifact"
        }
      ],
      "roleArn": "arn:aws:iam::<prod-account-id>:role/prods3role",
      "region": "us-east-1",
      "namespace": "DeployVariables"
    }
  ]
}

3.    Elimina la sección de metadatos al final del archivo codepipeline.json.

Importante: Asegúrate de eliminar también la coma que aparece antes de la sección de metadatos.

Ejemplo de sección de metadatos

"metadata": {
    "pipelineArn": "arn:aws:codepipeline:us-east-1:<dev-account-id>:crossaccountdeploy",
    "created": 1587527378.629,
    "updated": 1587534327.983
}

4.    Ejecuta el siguiente comando para actualizar la canalización:

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

Carga el sitio web de muestra al bucket de entrada

1.    Abre la consola de Amazon S3 en la cuenta de desarrollo.

2.    En la lista de nombres de buckets, elige tu bucket de S3 de entrada de desarrollo. Por ejemplo: codepipeline-input-bucket.

3.    Selecciona Cargar. A continuación, selecciona Añadir archivos.

4.    Selecciona el archivo sample-website.zip que descargaste anteriormente.

5.    Selecciona Cargar para ejecutar la canalización. Cuando se ejecuta la canalización, ocurre lo siguiente:

  • La acción de origen selecciona sample-website.zip del bucket de S3 de entrada de desarrollo (codepipeline-input-bucket). A continuación, la acción de origen coloca el archivo zip como artefacto de origen dentro del bucket de artefactos de la cuenta de desarrollo (codepipeline-us-east-1-0123456789).
  • En la acción de despliegue, el rol de servicio CodePipeline (AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy) asume el rol multicuenta (prods3role) en la cuenta de producción.
  • CodePipeline usa el rol multicuenta (prods3role) para acceder a la clave de KMS y al bucket de artefactos de la cuenta de desarrollo. A continuación, CodePipeline despliega los archivos extraídos en el bucket de S3 de salida de producción (codepipeline-output-bucket) de la cuenta de producción.

Nota: La cuenta de producción es la propietaria de los objetos extraídos en el bucket de S3 de salida de producción (codepipeline-output-bucket).

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 5 meses