Skip to main content

Designer Cloud y EMR sin servidor en AWS

Sigue esta guía para implementar el módulo de Designer Cloud para el procesamiento privado de datos de AWS.

Requisitos previos

Antes de implementar el módulo de Designer Cloud, debes completar estos pasos en la página de Configurar la cuenta de AWS y VPC para datos privados:

  1. La VPC dedicada a Alteryx One Platform se configuró tal y como se menciona en la sección Crear una VPC.

  2. Cuenta de servicio y política de IAM base adjuntos a la cuenta de servicio tal y como se menciona en la sección Configurar IAM.

  3. Se activó correctamente el aprovisionamiento de procesamiento privado de datos, como se menciona en la sección Aprovisionamiento de manejo privado de datos de activación.

Configuración de cuenta

Paso 1: Cómo configurar IAM

Paso 1a: Crear una política de IAM de Designer Cloud

Nota

AAC_DesignerCloud_SA_Policy es un nombre de política de ejemplo. Puedes elegir cualquier nombre para la política, pero el nombre debe comenzar con AAC_DesignerCloud.

Debes crear una política de IAM personalizada. Nómbrala AAC_DesignerCloud_SA_Policy y utiliza el siguiente documento de política. Recomendamos utilizar la pestaña JSON en lugar del editor visual. Alteryx One requiere algunos permisos de * para ejecutarse. Espera algunas advertencias de seguridad cuando crees la política.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::*:role/*",
            "Condition": {
                "StringEqualsIfExists": {
                    "iam:PassedToService": [
                        "ec2.amazonaws.com",
                        "ec2.amazonaws.com.cn"
                    ]
                }
            }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "eks:*",
                "iam:CreateServiceLinkedRole",
                "kms:CreateGrant",
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:Encrypt",
                "kms:GetKeyPolicy",
                "kms:GetKeyRotationStatus",
                "kms:ListGrants",
                "kms:ListResourceTags",
                "kms:ListRetirableGrants",
                "kms:PutKeyPolicy",
                "kms:RetireGrant",
                "kms:RevokeGrant",
                "kms:ScheduleKeyDeletion",
                "kms:TagResource",
                "kms:UntagResource"
            ],
            "Resource": [
                "arn:aws:eks:*:*:addon/*/*/*",
                "arn:aws:eks:*:*:cluster/*",
                "arn:aws:eks:*:*:nodegroup/*/*/*",
                "arn:aws:eks:*:*:identityproviderconfig/*/*/*/*",
                "arn:aws:eks:*:*:access-entry/*/*/*",
                "arn:aws:kms:*:*:key/*",
                "arn:aws:iam::*:role/*"
            ]
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:CreateOpenIDConnectProvider",
                "iam:CreatePolicy",
                "iam:CreatePolicyVersion",
                "iam:CreateRole",
                "iam:DeleteOpenIDConnectProvider",
                "iam:DeletePolicy",
                "iam:DeletePolicyVersion",
                "iam:DeleteRole",
                "iam:DeleteRolePolicy",
                "iam:DetachRolePolicy",
                "iam:GetOpenIDConnectProvider",
                "iam:GetPolicy",
                "iam:GetPolicyVersion",
                "iam:GetRole",
                "iam:GetRolePolicy",
                "iam:GetUser",
                "iam:GetUserPolicy",
                "iam:ListAttachedRolePolicies",
                "iam:ListAttachedUserPolicies",
                "iam:ListGroupsForUser",
                "iam:ListInstanceProfilesForRole",
                "iam:ListPolicyTags",
                "iam:ListPolicyVersions",
                "iam:ListRolePolicies",
                "iam:PassRole",
                "iam:PutRolePolicy",
                "iam:TagOpenIDConnectProvider",
                "iam:TagPolicy",
                "iam:TagRole",
                "iam:UntagOpenIDConnectProvider",
                "iam:UntagPolicy",
                "iam:UntagRole",
                "iam:UpdateOpenIDConnectProviderThumbprint",
                "iam:UpdateRole",
                "iam:UpdateAssumeRolePolicy"
            ],
            "Resource": [
                "arn:aws:iam::*:policy/*",
                "arn:aws:iam::*:oidc-provider/*",
                "arn:aws:iam::*:user/*",
                "arn:aws:iam::*:role/*"
            ]
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": [
                "autoscaling:*",
                "ec2:*",
                "eks:CreateCluster",
                "eks:ListClusters",
                "eks:DescribeAddonVersions",
                "elasticloadbalancing:*",
                "iam:GetAccountName",
                "iam:ListAccountAliases",
                "iam:ListRoles",
                "iam:CreateInstanceProfile",
                "iam:DeleteInstanceProfile",
                "iam:GetInstanceProfile",
                "iam:TagInstanceProfile",
                "iam:UntagInstanceProfile", 
                "iam:RemoveRoleFromInstanceProfile", 
                "iam:AddRoleToInstanceProfile", 
                "kms:CreateKey",
                "logs:CreateLogGroup",
                "logs:DeleteLogGroup",
                "logs:DescribeLogGroups",
                "logs:ListTagsLogGroup",
                "logs:PutRetentionPolicy",
                "logs:TagResource",
                "logs:UntagResource",
                "logs:TagLogGroup",
                "logs:UntagLogGroup",
                "logs:ListTagsForResource",
                "networkmanager:Describe*",
                "networkmanager:Get*",
                "networkmanager:List*",
                "s3:CreateBucket",
                "s3:DeleteBucket",
                "s3:DeleteBucketPolicy",
                "s3:DeleteBucketWebsite",
                "s3:DeleteObject",
                "s3:DeleteObjectVersion",
                "s3:DeleteObjectVersionTagging",
                "s3:GetAccelerateConfiguration",
                "s3:GetBucketAcl",
                "s3:GetBucketCORS",
                "s3:GetBucketLocation",
                "s3:GetBucketLogging",
                "s3:GetBucketObjectLockConfiguration",
                "s3:GetBucketOwnershipControls",
                "s3:GetBucketPolicy",
                "s3:GetBucketPolicyStatus",
                "s3:GetBucketPublicAccessBlock",
                "s3:GetBucketRequestPayment",
                "s3:GetBucketTagging",
                "s3:GetBucketVersioning",
                "s3:GetBucketWebsite",
                "s3:GetEncryptionConfiguration",
                "s3:GetLifecycleConfiguration",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:GetObjectVersion",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectVersionAttributes",
                "s3:GetObjectVersionForReplication",
                "s3:GetObjectVersionTagging",
                "s3:GetObjectVersionTorrent",
                "s3:GetReplicationConfiguration",
                "s3:ListAllMyBuckets",
                "s3:ListBucket",
                "s3:ListBucketVersions",
                "s3:PutAccelerateConfiguration",
                "s3:PutBucketAcl",
                "s3:PutBucketCORS",
                "s3:PutBucketLogging",
                "s3:PutBucketObjectLockConfiguration",
                "s3:PutBucketOwnershipControls",
                "s3:PutBucketPolicy",
                "s3:PutBucketPublicAccessBlock",
                "s3:PutBucketRequestPayment",
                "s3:PutBucketTagging",
                "s3:PutBucketVersioning",
                "s3:PutBucketWebsite",
                "s3:PutEncryptionConfiguration",
                "s3:PutLifecycleConfiguration",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutObjectVersionAcl",
                "s3:PutObjectVersionTagging",
                "sts:GetCallerIdentity",
                "memorydb:CreateSubnetGroup",
                "memorydb:CreateUser",
                "memorydb:CreateAcl",
                "memorydb:CreateCluster",
                "memorydb:TagResource",
                "memorydb:DescribeSubnetGroups",
                "memorydb:DescribeUsers",
                "memorydb:DescribeACLs",
                "memorydb:DescribeClusters",
                "memorydb:ListTags",
                "memorydb:DeleteUser",
                "memorydb:DeleteSubnetGroup",
                "memorydb:DeleteAcl",
                "memorydb:DeleteCluster",
                "memorydb:UpdateAcl",
                "memorydb:UpdateCluster",
                "memorydb:UpdateSubnetGroup",
                "memorydb:UpdateUser"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor4",
            "Effect": "Allow",
            "Action": "secretsmanager:*",
            "Resource": "arn:aws:secretsmanager:*:*:secret:*"
        }
    ]
}

Paso 1b: Etiquetar la política de IAM

Etiqueta la política de IAM personalizada que creaste en el paso 1a.

Nombre de la etiqueta

Valor

AACResource

aac_sa_custom_policy

Paso 1c: Adjuntar la política de IAM

Adjunta la política de IAM de AAC_DesignerCloud_SA_Policy a la cuenta de servicio aac_automation_sa creada en la página Configurar la cuenta de AWS y VPC para datos privados.

Paso 2: Configurar la subred

Nota

Designer Cloud comparte una configuración de subred con aprendizaje automático, Auto Insights y App Builder. Si estás implementando más de una de esas aplicaciones, solo debes configurar las subredes una vez.

Designer Cloud en un entorno de procesamiento privado de datos requiere hasta cinco grupos de subredes. Cada grupo contiene tres subredes individuales, cada una en una zona de disponibilidad diferente.

  • Grupo eks_control (obligatorio): el plano de control EKS utiliza esta subred para aceptar solicitudes de ejecución de tareas entrantes.

  • Grupo eks_node (obligatorio): el clúster de EKS utiliza esta subred para ejecutar tareas de software de Alteryx (por ejemplo, conectividad, conversión, procesamiento, publicación).

  • Grupo public (obligatorio): este grupo no ejecuta ningún servicio, pero el grupo eks_node lo utiliza para salir del clúster.

  • Grupo private (obligatorio): este grupo ejecuta servicios privados para el procesamiento privado de datos.

Se utiliza para EMR
  • Grupo option (opcional): utiliza este grupo si habilitas el procesamiento de EMR dentro de tu entorno de procesamiento privado de datos. Los servicios de EMR no se ejecutan en el clúster, pero se necesita el espacio de IP para interactuar con los puntos de conexión de EMR sin servidor de AWS.

Paso 2a: Crear subredes en la VPC

Configura las subredes en la VPC aac_vpc.

Crea subredes y asígnales etiquetas según el siguiente ejemplo. Puedes ajustar los valores de CIDR y de subredes para que se ajusten a tu arquitectura de red.

Los espacios de direcciones grandes están diseñados para adaptarse a un clúster totalmente escalado. Puedes elegir un espacio de direcciones más pequeño si es necesario, pero podrías tener problemas de escalado bajo cargas de procesamiento pesadas.

Importante

Debes etiquetar las subredes con Nombre de la etiqueta y Valor de la etiqueta como se menciona en la tabla.

CIDR

Nombre de la subred

Subred

AZ

Nombre de la etiqueta

Valor de la etiqueta

Nota

10.64.0.0/18

eks_node

10.64.0.0/21

AZa

AACSubnet

eks_node

eks_node

10.64.8.0/21

AZb

AACSubnet

eks_node

eks_node

10.64.16.0/21

AZc

AACSubnet

eks_node

10.64.24.0/21

SPARE

10.64.32.0/19

SPARE (se puede configurar para una actualización azul/verde más tarde)

10.10.0.0/21

eks_control

10.10.0.0/27

AZa

AACSubnet

eks_control

eks_control

10.10.0.32/27

AZb

AACSubnet

eks_control

eks_control

10.10.0.64/27

AZc

AACSubnet

eks_control

10.10.0.96/27

SPARE

público

10.10.0.128/27

AZa

AACSubnet

público

público

10.10.0.160/27

AZb

AACSubnet

público

público

10.10.0.192/27

AZc

AACSubnet

público

10.10.0.224/27

SPARE

privado

10.10.1.0/25

AZa

AACSubnet

privado

privado

10.10.1.128/25

AZb

AACSubnet

privado

privado

10.10.2.0/25

AZc

AACSubnet

privado

10.10.1.128/25

SPARE

opción

10.10.4.0/24

AZa

AACSubnet

opción

opción

10.10.5.0/24

AZa

AACSubnet

opción

opción

10.10.6.0/24

AZa

AACSubnet

opción

10.10.7.0/24

SPARE

Paso 2b: Tablas de ruta de subred

Crea la tabla de rutas para tus subredes.

Nota

Esta tabla de rutas es un ejemplo.

Nombre de la subred

Destino de la ruta

Objetivo

Comentarios

eks_node

/18 Bloque de CIDR

/21 Bloque de CIDR

<id. del prefijo s3>

0.0.0.0/0

Local

Local

<id. del punto de conexión de vpce>

<Id. de puerta de enlace>

Configura las mismas rutas en las tres tablas de enrutamiento de subred AZ.

eks_control

/18 Bloque de CIDR

/21 Bloque de CIDR

<id. del prefijo s3>

0.0.0.0/0

Local

Local

<id. del punto de conexión de vpce>

<Id. de puerta de enlace>

Configura las mismas rutas en las tres tablas de enrutamiento de subred AZ.

público

/18 Bloque de CIDR

/21 Bloque de CIDR

0.0.0.0/0

Local

Local

<Id. de puerta de enlace>

Configura las mismas rutas en las tres tablas de enrutamiento de subred AZ.

privado

/18 Bloque de CIDR

/21 Bloque de CIDR

<id. del prefijo s3>

0.0.0.0/0

Local

Local

<id. del punto de conexión de vpce>

<Id. de puerta de enlace>

Configura las mismas rutas en las tres tablas de enrutamiento de subred AZ.

0.0.0.0/0 debe estar saliendo a la red pública.

opción

/18 Bloque de CIDR

/21 Bloque de CIDR

<id. del prefijo s3>

0.0.0.0/0

local

local

<id. del punto de conexión de vpce>

<Id. de puerta de enlace>

Configura las mismas rutas en las tres tablas de enrutamiento de subred AZ.

0.0.0.0/0 debe estar saliendo a la red pública.

Nota

Tu <id> de puerta de enlace puede ser una puerta de enlace NAT zonal creada por AZ o una puerta de enlace de tránsito, según la arquitectura de tu red. Si la puerta de enlace es NAT, crea una puerta de enlace NAT por AZ para las subredes públicas.

Procesamiento privado de datos

Atención

Cambiar o eliminar cualquier recurso de nube pública provisionado por Alteryx One después de configurar el Manejo privado de datos puede causar incoherencias. Estas incoherencias pueden provocar errores durante la ejecución de tareas o al desaprovisionar la configuración de Manejo privado de datos.

Paso 1: Activar la implementación de Designer Cloud

El aprovisionamiento de Designer Cloud se activa desde la consola de administrador en Alteryx One. Necesitas privilegios de administrador de espacio de trabajo para poder verlo dentro de un espacio de trabajo.

  1. En la página inicial de Alteryx One, selecciona el ícono de círculo en la parte superior derecha con tus iniciales en él. Selecciona Consola de administración en el menú.

  2. Selecciona Manejo privado de datos en el menú de navegación de la izquierda.

  3. Selecciona la casilla de verificación de Designer Cloud y, a continuación, selecciona Update.

Al seleccionar Actualizar, se activa la implementación del clúster y los recursos en la cuenta de AWS. Esto ejecuta un conjunto de comprobaciones de validación para verificar la configuración correcta de la cuenta de AWS.

Nota

El proceso de aprovisionamiento tarda aproximadamente entre 35 y 40 minutos en completarse.

Una vez finalizado el aprovisionamiento, puedes ver los recursos creados (por ejemplo, instancias de EC2 y grupos de nodos) a través de la consola de AWS. Es muy importante que no los modifiques por tu cuenta. Los cambios manuales pueden causar problemas con la función del procesamiento privado de datos.

Paso 2: Anexar la relación de confianza del rol personalizado

Nota

Este paso solo es necesario si utilizaste un rol entre cuentas para los permisos cuando configuraste el almacenamiento privado de datos. Si utilizaste una clave de acceso para ese paso, puedes omitir este paso.

Importante

Debes esperar a que se complete correctamente el paso 1 antes de continuar con este paso.

Si tu almacenamiento privado de datos utiliza un rol entre cuentas, entonces para que tu nuevo entorno de procesamiento privado de datos pueda leer/escribir desde tu almacenamiento privado de datos, debes actualizar ese rol para agregar una relación de confianza con tu nuevo rol de clúster de Kubernetes:

{
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
         "AWS": "arn:aws:iam::<accountid>:role/aac-<xxxx-xxxxxxxxxxxx>-cluster-role"
    },
    "Action": "sts:AssumeRole"
}

Nota

Reemplaza AWS Principal por el ARN del rol de IAM creado durante el proceso de aprovisionamiento para el manejo privado de datos.

<accountid>: número de cuenta de AWS en el que se ha aprovisionado el manejo del entorno de procesamiento privado de datos.

<xxxx-xxxxxxxxxx>: los dos últimos segmentos del identificador del entorno de procesamiento privado de datos. Puedes encontrar este identificador en la interfaz de usuario de administración una vez que se haya configurado correctamente el entorno de procesamiento privado de datos.

Situación de ejemplo:

Identificador de la cuenta: 123456789012

Identificador del entorno de procesamiento privado de datos: b2a65fbd-95dc-490a-b69b-a1dc92df224e

ARN del rol: arn:aws:iam::123456789012:role/aac-b69b-a1dc92df224e-cluster-role

Para obtener más información, consulta https://docs.aws.amazon.com/directoryservice/latest/admin-guide/edit_trust.html.

Paso 3: Actualizar la política de claves de KMS

Una vez que crees correctamente el procesamiento privado de datos, se agregará un rol personalizado llamado credential-service-role a tu cuenta. Este rol permite a la cuenta de servicio de credenciales de Kubernetes recuperar credenciales de acceso a datos privados del almacén de claves.

Ahora, actualiza la política de la clave de KMS creada en Configurar la cuenta de AWS y VPC para datos privados - Paso 5: Crear una clave simétrica para almacén seguro para permitir el rol personalizado de credential-service-role con permisos personalizados.

  1. Ve a Servicios de administración de claves y selecciona la clave creada Configurar la cuenta de AWS y VPC para datos privados.

  2. Selecciona Política de claves y selecciona Editar.

  3. Elimina el permiso predeterminado y actualiza con lo siguiente:

    {
      "Version": "2012-10-17",
      "Id": "key-consolepolicy-3",
      "Statement": [
        {
          "Sid": "Enable IAM User Permissions",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::<account id>:root"
          },
          "Action": "kms:*",
          "Resource": "*"
        },
        {
          "Sid": "Allow use of the key",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::<account id>:role/credential-service-role"
          },
          "Action": [
            "kms:Encrypt",
            "kms:Decrypt",
            "kms:ReEncrypt*",
            "kms:GenerateDataKey*",
            "kms:DescribeKey"
          ],
          "Resource": "*"
        }
      ]
    }

    Nota

    <accountID> es el número de cuenta de AWS en el que se ha aprovisionado el manejo del entorno de procesamiento privado de datos.

  4. Selecciona Guardar cambios.

Paso 4: EMR sin servidor (opcional)

Configura EMR sin servidor si utilizas el procesamiento de Spark/EMR.

Habilitar EMR

  1. Iniciar sesión en Alteryx One.

  2. En el menú Perfil, selecciona Consola de administrador.

  3. En el panel de navegación izquierdo, selecciona Manejo privado de datos.

  4. Selecciona Procesamiento de Spark (EMR).

  5. Selecciona Actualizar.

Actualiza el rol personalizado creado para la conexión S3

Agrega la política personalizada y el rol personalizado de AWS como Almacenamiento privado de datos S3 con estos permisos y relaciones de confianza para EMR sin servidor:

Anexa el documento de política personalizada

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EMRServerlessAccess",
            "Effect": "Allow",
            "Action": [
                "emr-serverless:CreateApplication",
                "emr-serverless:UpdateApplication",
                "emr-serverless:DeleteApplication",
                "emr-serverless:ListApplications",
                "emr-serverless:GetApplication",
                "emr-serverless:StartApplication",
                "emr-serverless:StopApplication",
                "emr-serverless:StartJobRun",
                "emr-serverless:CancelJobRun",
                "emr-serverless:ListJobRuns",
                "emr-serverless:GetJobRun"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowNetworkInterfaceCreationViaEMRServerless",
            "Effect": "Allow",
            "Action": "ec2:CreateNetworkInterface",
            "Resource": [
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*:*:security-group/*",
                "arn:aws:ec2:*:*:subnet/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:CalledViaLast": "ops.emr-serverless.amazonaws.com"
                }
            }
        },
        {
            "Sid":"AllowEMRServerlessServiceLinkedRoleCreation",
            "Effect":"Allow",
            "Action":"iam:CreateServiceLinkedRole",
            "Resource":"arn:aws:iam:::role/aws-service-role/ops.emr-serverless.amazonaws.com/AWSServiceRoleForAmazonEMRServerless"
        },
        {
            "Sid": "AllowPassingRuntimeRole",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam:::role/aac--emr-serverless-spark-execution",
            "Condition": {
                "StringLike": {
                    "iam:PassedToService": "emr-serverless.amazonaws.com"
                }
            }
        },
        {
            "Sid": "S3ResourceBucketAccess",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::aac--emr-logs",
                "arn:aws:s3:::aac--emr-logs/*"
            ]
        }
    ]
}

Anexa la relación de confianza del rol personalizado

{
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam:::role/aac--emr-serverless-spark-execution"
    },
    "Action": "sts:AssumeRole"
},
{
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
        "Service": "emr-serverless.amazonaws.com"
    },
    "Action": "sts:AssumeRole"
}

Nota

Cuando eliminas el manejo privado de datos, AWS reemplaza la relación de confianza del ARN aac-<xxxxxxxxxxx>-cluster-role por una clave de acceso. También debes eliminar la relación de confianza de la interfaz de usuario.

Nota

Reemplaza AWS Principal por el ARN del rol de IAM creado durante el proceso de aprovisionamiento para el manejo privado de datos.

<accountid>: número de cuenta de AWS en el que se ha aprovisionado el manejo del entorno de procesamiento privado de datos.

<xxxx-xxxxxxxxxx>: los dos últimos segmentos del identificador del entorno de procesamiento privado de datos. Puedes encontrar este identificador en la interfaz de usuario de administración una vez que se haya configurado correctamente el entorno de procesamiento privado de datos.

Situación de ejemplo:

Identificador de la cuenta: 123456789012

Identificador del entorno de procesamiento privado de datos: b2a65fbd-95dc-490a-b69b-a1dc92df224e

ARN del rol: arn:aws:iam::123456789012:role/aac-b69b-a1dc92df224e-emr-serverless-spark-execution

ARN de S3: arn:aws:s3:::aac-aac-b69b-a1dc92df224e-emr-logs