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

12 minutos de lectura
0

Quiero desplegar artefactos en un bucket de Amazon Simple Storage Service (Amazon S3) en una cuenta diferente. También quiero configurar la cuenta de destino como propietaria del objeto. ¿Hay alguna forma de hacerlo mediante AWS CodePipeline con un proveedor de acciones de despliegue de Amazon S3?

Resolución

Nota: El siguiente procedimiento de ejemplo supone lo siguiente:

  • Tiene 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á desplegando artefactos de la cuenta de desarrollo en un bucket de S3 de la cuenta de producción.
  • Está 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, consulte el artículo siguiente: ¿Cómo puedo desplegar artefactos en Amazon S3 en otra cuenta de AWS mediante CodePipeline y una ACL predefinida?

Cree una clave de AWS KMS para usarla con CodePipeline en la cuenta de desarrollo

Importante: Debe 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.    Abra la consola de AWS KMS en la cuenta de desarrollo.

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

3.    Elija Crear clave.

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

5.    Amplíe las opciones avanzadas.

6.    En Origen del material de claves, elija KMS. A continuación, seleccione Siguiente.

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

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

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

  1. Seleccione Siguiente. Se abre la página Definir permisos de uso de claves.

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

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

**Nota:**También puede seleccionar un rol de servicio existente en la sección Esta cuenta. Si selecciona un rol de servicio existente, omita los pasos de la sección Actualice la política de uso de KMS de la cuenta de desarrollo.

13.    Revise la política de claves. A continuación, seleccione Finalizar.

Cree un CodePipeline en la cuenta de desarrollo

1.    Abra la consola de CodePipeline. A continuación, seleccione Crear canalización.

2.    En Nombre de canalización, introduzca un nombre para su 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 puede elegir otro rol de servicio existente con acceso a la clave de KMS.

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

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

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

6.    Para la clave administrada por el cliente de KMS, seleccione el alias de su clave en la lista (s3deploykey, por ejemplo). A continuación, elija Siguiente. Se abre la página Añadir la etapa de origen.

  1. Para el proveedor de origen, elija Amazon S3.

8.    En Bucket, introduzca el nombre de su 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, escriba sample-website.zip.

**Importante:**Para utilizar un ejemplo de sitio web de AWS en lugar de su propio sitio web, consulte el Tutorial: Cree una canalización que utilice Amazon S3 como proveedor de despliegue. A continuación, busque «ejemplo de sitio web estático» en los requisitos previos de la sección 1: Despliegue archivos de sitios web estáticos en la sección Amazon S3.

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

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

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

13.    Para la región, elija la región de AWS en la que se encuentra su 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 debe comprobar lo siguiente:

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

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

16.    Elija Siguiente.

17.    Elija 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 Cargue el sitio web de muestra al bucket de entrada de este artículo se describe cómo resolver este error.

Actualice la política de uso de KMS de la cuenta de desarrollo

Importante: Omita esta sección si utiliza un rol de servicio de CodePipeline existente.

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

2.    Seleccione el alias de su clave (s3deploykey, por ejemplo).

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

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

5.    Seleccione Añadir.

Configure un rol multicuenta en la cuenta de producción

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

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

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

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

Importante: Reemplace codepipeline-output-bucket por el nombre del bucket de S3 de su 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.    Elija Revisar la política.

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

6.    Elija Crear política.

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

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

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

Nota: Reemplace el ARN de la clave de KMS que creó. Sustituya 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.    Elija Revisar la política.

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

5.    Elija Crear política.

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

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

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

3.    Elija Otra cuenta de AWS.

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

5.    Elija Siguiente: Permisos.

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

7.    Elija Siguiente: Etiquetas.

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

9.    En Nombre de rol, escriba prods3role.

10.    Elija Crear rol.

11.    En la lista de roles, seleccione prods3role.

12.    Elija la relación de confianza. A continuación, seleccione Editar la relación de confianza.

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

Importante: Sustituya dev-account-id por el ID de cuenta de AWS de su cuenta de desarrollo. Sustituya AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy por el nombre del rol de servicio de su 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.    Seleccione Actualizar la política de confianza.

Actualice la política de bucket para el bucket de artefactos de CodePipeline en la cuenta de desarrollo

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

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

3.    Seleccione Permisos. A continuación, elija Política de bucket.

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

Importante: Para alinearse con el formato JSON adecuado, añada una coma después de las sentencias existentes. Sustituya prod-account-id por el ID de cuenta de AWS de su cuenta de producción. Sustituya codepipeline-us-east-1-0123456789 por el nombre de su 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.    Seleccione Guardar.

Adjunte una política a su rol de servicio de CodePipeline en la cuenta de desarrollo que le permita asumir la función multicuenta que usted creó

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

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

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

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

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

4.    Elija Revisar la política.

5.    En Nombre, escriba assumeprods3role.

6.    Elija Crear política.

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

8.    Elija Adjuntar políticas. A continuación, seleccione assumeprods3role.

9.    Elija Adjuntar política.

Actualice su canalización para usar la función multicuenta en la cuenta de desarrollo

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

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

Importante: Reemplace crossaccountdeploy por el nombre de su canalización.

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

2.    Añada el ARN del rol de IAM multicuenta (roleArn) a la sección de acciones de despliegue del archivo codepipeline.json. Para obtener más información, consulte 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 despliegue que incluye un ARN de rol de IAM para varias cuentas

Importante: Sustituya el prod-account-id por el ID de cuenta de AWS de su 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.    Elimine la sección de metadatos al final del archivo codepipeline.json.

Importante: Asegúrese 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.    Ejecute el siguiente comando para actualizar la canalización:

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

Cargue el sitio web de muestra al bucket de entrada

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

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

3.    Seleccione Cargar. A continuación, seleccione Añadir archivos.

4.    Seleccione el archivo sample-website.zip que descargó anteriormente.

5.    Seleccione 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 2 años