¿Cómo se pueden solucionar los errores de distribución de las AMI cifradas en el Generador de imágenes?

Última actualización: 26/08/2022

Aparecen errores al intentar distribuir AMI cifradas a otra cuenta en el Generador de imágenes de EC2. ¿Cómo se soluciona este problema?

Descripción breve

Los siguientes escenarios pueden causar errores de distribución en el Generador de imágenes de EC2 cuando se distribuye una imagen de máquina de Amazon (AMI) cifrada a otra cuenta:

Resolución

La AMI que se distribuye está cifrada con la clave administrada por AWS predeterminada para Amazon EBS

Aparece el siguiente error:

Distribution failed with JobId 'XXXXXXXXXXXXXX', status = 'Failed' for ARN 'arn:aws:imagebuilder:us-east-1:xxxxxxxxxxxx:image/test-recipe/0.0.1/1'. 'Not all distribution jobs are completed. 1) EC2 Client Error: 'Snapshots encrypted with the AWS Managed CMK can’t be shared. Specify another snapshot.' when distributing the image from the source account (ID: xxxxxxxxxxxx) to the destination account (ID: xxxxxxxxxxxx) in Region us-east-1.'

No puede compartir AMI que estén cifradas con la clave predeterminada de AWS KMS. Para obtener más información, consulte Compartir una AMI con cuentas específicas de AWS.

Los escenarios que se deben comprobar son:

  • La clave de KMS administrada por AWS se especifica en la configuración de almacenamiento de la receta.
  • La clave de KMS administrada por AWS se especifica en la configuración de la distribución junto con una o más cuentas de destino.
  • La AMI principal se cifra con la clave de KMS administrada por AWS.
  • La AMI principal tiene varias instantáneas, y al menos una está cifrada con la clave de KMS administrada por AWS.
  • El cifrado predeterminado está activado en la región de AWS y utiliza la clave de KMS administrada por AWS.

Para resolver este problema, cree una nueva versión de la receta de imagen y especifique una clave de KMS administrada por el cliente para el cifrado en la configuración de almacenamiento de la receta. En el caso de las claves de KMS en la configuración de la distribución, especifique una clave de KMS administrada por el cliente para el cifrado cuando distribuya las AMI a otras cuentas.

La entidad de AWS KMS o IAM no tiene los permisos necesarios

Puede distribuir AMI en el Generador de imágenes mediante las configuraciones launchPermissions o targetAccountIds.

launchPermissions

Cuando se distribuye una AMI por medio de launchPermissions, el Generador de imágenes utiliza el rol de IAM AWSServiceRoleForImageBuilder en la cuenta de origen. De forma predeterminada, AWSServiceRoleForImageBuilder tiene el permiso de AWS KMS necesario para los recursos de la cuenta de origen.

La política de claves de KMS tiene una instrucción que permite la acción “kms:*” para el usuario raíz. Si esta instrucción no está en la política de claves, el rol vinculado al servicio no puede acceder a la clave en la cuenta de origen. Si la acción “kms:*” no está permitida para el usuario raíz, modifique la política para permitir que el rol vinculado al servicio utilice la clave.

Por ejemplo:

{
  "Sid": "Enable IAM User Permissions",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::source_account_id:role/aws-service-role/imagebuilder.amazonaws.com/AWSServiceRoleForImageBuilder"
  },
  "Action": [
    "kms:Decrypt",
    "kms:Encrypt",
    "kms:GenerateDataKeyWithoutPlaintext",
    "kms:DescribeKey",
    "kms:CreateGrant",
    "kms:ReEncryptFrom",
    "kms:ReEncryptTo"
  ],
  "Resource": "*"
}

Nota: Sustituya source_account_id por el ID de la cuenta de origen.

targetAccountIds

Si la cuenta de destino no tiene el rol de IAM EC2ImageBuilderDistributionCrossAccountRole, o la cuenta de origen no aparece en la política de confianza, aparecerá el siguiente error:

Distribution failed with JobId 'xxxxxxxxxxxxxx', status = 'Failed' for ARN 'arn:aws:imagebuilder:us-east-1:XXXXXXXXXX:image/testdistribution/2.0.0/3'. 'Not all distribution jobs are completed. 1) STS Client Error: 'User: arn:aws:sts::XXXXXXXXXXXX:assumed-role/AWSServiceRoleForImageBuilder/Ec2ImageBuilderIntegrationService is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::xxxxxxxxx:role/EC2ImageBuilderDistributionCrossAccountRole'. Please make sure your 'EC2ImageBuilderDistributionCrossAccountRole' is setup with correct permission policies. If you are copying AMI to opt-in regions, please make sure the region is enabled in the account when distributing the image from the source account (ID: XXXXXXXXXXXX) to the destination account (ID: XXXXXXXXXXXX) in Region us-east-1.'STS Client Error User is not authorized to perform: sts:AssumeRole on resource.

Para resolver este problema, cree el rol EC2ImageBuilderDistributionCrossAccountRole. A continuación, adjunte la política Ec2ImageBuilderCrossAccountDistributionAccess para permitir la distribución entre cuentas. A continuación, enumere AWSServiceRoleForImageBuilder en la política de confianza EC2ImageBuilderDistributionCrossAccountRole:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com",
        "AWS": "arn:aws:iam::XXXXXXXXXX:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Es posible que aparezca el siguiente error debido a problemas con los permisos de AWS KMS entre cuentas:

Distribution failed with JobId 'xxxxxxxxxxxxxx', status = 'Failed' for ARN 'arn:aws:imagebuilder:ap-southeast-2:11111111111:image/test/1.0.0/1'. 'Not all distribution jobs are completed. 1) AMI Copy Reported Failure For 'ami-0047623fbcxxxxx' when distributing the image from the source account (ID: 11111111111) to the destination account (ID: 222222222222) in Region ap-southeast-2.'

Cuando se distribuye una AMI por medio de targetAccountIds, el Generador de imágenes utiliza el rol AWSServiceRoleForImageBuilder en la cuenta de origen. En la cuenta de destino, utiliza el rol EC2ImageBuilderDistributionCrossAccountRole. Asegúrese de dar permiso a EC2ImageBuilderDistributionCrossAccountRole para utilizar las claves de AWS KMS en la configuración de la distribución y la configuración del almacenamiento de la receta.

Por ejemplo:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:Encrypt",
        "kms:GenerateDataKeyWithoutPlaintext",
        "kms:DescribeKey",
        "kms:CreateGrant",
        "kms:ReEncryptFrom",
        "kms:ReEncryptTo"
      ],
      "Resource": "*"
    }
  ]
}

Nota: También puede restringir la sección Recursos al especificar el ARN de la clave de AWS KMS.

Si las claves de KMS administradas por el cliente pertenecen a la cuenta de destino, entonces debe compartir la clave de AWS KMS con la cuenta de origen. Si las claves de KMS administradas por el cliente pertenecen a la cuenta de origen, entonces debe compartir las claves de AWS KMS con la cuenta de destino.

Complete los siguientes pasos para compartir las claves de AWS KMS:

1.    Inicie sesión en la cuenta donde se encuentra la clave de KMS.

2.    Abra la consola de AWS KMS en la misma región de AWS.

3.    En el panel de navegación de la izquierda, elija Customer managed keys (Claves administradas por el cliente).

4.    Seleccione KMS key ID (ID de la clave de KMS).

5.    Elija la pestaña Key Policy (Política de la clave).

6.    En la sección Other AWS accounts (Otras cuentas de AWS), elija Add other AWS accounts (Agregar otras cuentas de AWS).

7.    Especifique el ID de la cuenta con la que desea compartir la clave de KMS.

8.    Elija Save Changes (Guardar los cambios).