Configura l’accesso cross-account dei cluster di Amazon Redshift in Amazon SageMaker Studio utilizzando il VPC peering

Configura l'accesso cross-account dei cluster di Amazon Redshift in SageMaker Studio con VPC peering.

Con il cloud computing, poiché la potenza di calcolo e i dati diventano sempre più disponibili, il machine learning (ML) sta avendo un impatto in ogni settore ed è una parte fondamentale di ogni attività e industria.

Amazon SageMaker Studio è l’ambiente di sviluppo ML completamente integrato (IDE) con un’interfaccia visuale basata sul web. Puoi eseguire tutti i passaggi di sviluppo ML e avere completo accesso, controllo e visibilità di ogni passo necessario per creare, addestrare e distribuire modelli.

Amazon Redshift è un data warehouse cloud completamente gestito, veloce, sicuro e scalabile. Le organizzazioni spesso vogliono utilizzare SageMaker Studio per ottenere previsioni da dati archiviati in un data warehouse come Amazon Redshift.

Come descritto nel Framework AWS Well-Architected, la separazione dei carichi di lavoro tra account consente all’organizzazione di impostare regole comuni mentre isola gli ambienti. Ciò può essere particolarmente utile per determinati requisiti di sicurezza, nonché per semplificare i controlli di costo e il monitoraggio tra progetti e team. Le organizzazioni con un’architettura multi-account di solito hanno Amazon Redshift e SageMaker Studio in due account AWS separati. Inoltre, Amazon Redshift e SageMaker Studio sono tipicamente configurati in VPC con subnet private per migliorare la sicurezza e ridurre il rischio di accesso non autorizzato come best practice.

Amazon Redshift supporta nativamente la condivisione dei dati tra account quando vengono utilizzati i tipi di nodo RA3. Se stai utilizzando altri tipi di nodo Amazon Redshift, come DS2 o DC2, puoi utilizzare il VPC peering per stabilire una connessione tra Amazon Redshift e SageMaker Studio in account diversi.

In questo post, illustreremo istruzioni passo-passo per stabilire una connessione tra account per qualsiasi tipo di nodo Amazon Redshift (RA3, DC2, DS2), collegando il cluster Amazon Redshift situato in un account AWS a SageMaker Studio in un altro account AWS nella stessa regione utilizzando il VPC peering.

Panoramica della soluzione

Iniziamo con due account AWS: un account produttore con il data warehouse Amazon Redshift e un account consumatore per i casi d’uso di Amazon SageMaker ML che ha configurato SageMaker Studio. Qui di seguito trovi una panoramica ad alto livello del flusso di lavoro:

  1. Configura SageMaker Studio con la modalità VPCOnly nell’account consumatore. Ciò impedisce a SageMaker di fornire accesso a Internet ai notebook dello studio. Tutto il traffico di SageMaker Studio avviene tramite la VPC e le subnet specificate.
  2. Aggiorna il dominio SageMaker Studio per attivare SourceIdentity e propagare il nome del profilo utente.
  3. Crea un ruolo IAM (Identity and Access Management) in AWS nel conto produttore di Amazon Redshift che il ruolo IAM di SageMaker Studio assumerà per accedere ad Amazon Redshift.
  4. Aggiorna il ruolo di esecuzione IAM di SageMaker in SageMaker Studio nell’account consumatore che SageMaker Studio utilizzerà per assumere il ruolo nell’account produttore di Amazon Redshift.
  5. Configura una connessione di peering tra le VPC nell’account produttore di Amazon Redshift e nell’account consumatore di SageMaker Studio.
  6. Interroga Amazon Redshift in SageMaker Studio nell’account consumatore.

Il seguente diagramma illustra l’architettura della soluzione.

Prerequisiti

I passaggi in questo post presuppongono che Amazon Redshift sia stato lanciato in una subnet privata nell’account produttore di Amazon Redshift. Il lancio di Amazon Redshift in una subnet privata fornisce un ulteriore livello di sicurezza e isolamento rispetto al lancio in una subnet pubblica perché la subnet privata non è direttamente accessibile da Internet ed è più sicura da attacchi esterni.

Per scaricare librerie pubbliche, è necessario creare una VPC e una subnet privata e pubblica nell’account consumatore di SageMaker. Quindi, lanciare un NAT gateway nella subnet pubblica e aggiungere un internet gateway per SageMaker Studio nella subnet privata per accedere a Internet. Per istruzioni su come stabilire una connessione a una subnet privata, consulta Come configuro un NAT gateway per una subnet privata in Amazon VPC?

Configurare SageMaker Studio con la modalità VPCOnly nell’account consumatore

Per creare SageMaker Studio con la modalità VPCOnly, seguire i seguenti passaggi:

  1. Nella console di SageMaker, scegli Studio nel riquadro di navigazione.
  2. Avvia SageMaker Studio, scegli Impostazione standard e scegli Configura.

Se stai già utilizzando AWS IAM Identity Center (il successore di AWS Single Sign-On) per accedere ai tuoi account AWS, puoi utilizzarlo per l’autenticazione. In caso contrario, puoi utilizzare IAM per l’autenticazione e utilizzare i tuoi ruoli federati esistenti.

  1. Nella sezione Impostazioni generali, seleziona Crea un nuovo ruolo.
  2. Nella sezione Crea un ruolo IAM, specifica eventualmente i tuoi bucket di Amazon Simple Storage Service (Amazon S3) selezionando Qualsiasi, Specifica o Nessuno, quindi scegli Crea ruolo.

In questo modo viene creato un ruolo di esecuzione di SageMaker, come ad esempio AmazonSageMaker-ExecutionRole-00000000.

  1. Nella sezione Sezione rete e archiviazione, scegli la tua VPC, la subnet (subnet privata) e il gruppo di sicurezza che hai creato come prerequisiti.
  2. Seleziona Solo VPC, quindi scegli Avanti.

Aggiorna il tuo dominio SageMaker Studio per attivare SourceIdentity per propagare il nome del profilo utente

SageMaker Studio è integrato con AWS CloudTrail per consentire agli amministratori di monitorare e verificare l’attività degli utenti e le chiamate API dai notebook di SageMaker Studio. Puoi configurare SageMaker Studio per registrare l’identità dell’utente (in particolare, il nome del profilo utente) per monitorare e verificare l’attività degli utenti e le chiamate API dai notebook di SageMaker Studio negli eventi di CloudTrail.

Per registrare attività specifiche degli utenti tra diversi profili utente, ti consigliamo di attivare SourceIdentity per propagare il dominio di SageMaker Studio con il nome del profilo utente. In questo modo puoi persistere le informazioni dell’utente nella sessione e attribuire azioni a un utente specifico. Questo attributo viene anche persistito quando si concatenano i ruoli, in modo da ottenere una visibilità dettagliata sulle loro azioni nell’account produttore. Al momento della stesura di questo post, puoi configurarlo solo utilizzando l’interfaccia della riga di comando AWS (AWS CLI) o qualsiasi altro strumento a riga di comando.

Per aggiornare questa configurazione, tutte le app nel dominio devono trovarsi nello stato Interrotto o Eliminato.

Utilizza il seguente codice per abilitare la propagazione del nome del profilo utente come SourceIdentity:

update-domain
--domain-id <value>
[--default-user-settings <value>]
[--domain-settings-for-update "ExecutionRoleIdentityConfig=USER_PROFILE_NAME"]

Questo richiede che tu aggiunga sts:SetSourceIdentity nella relazione di trust per il tuo ruolo di esecuzione.

Crea un ruolo IAM nell’account del produttore Amazon Redshift che SageMaker Studio deve assumere per accedere ad Amazon Redshift

Per creare un ruolo che SageMaker assumerà per accedere ad Amazon Redshift, segui i seguenti passaggi:

  1. Apri la console IAM nell’account del produttore Amazon Redshift.

  1. Scegli Ruoli nel riquadro di navigazione, quindi scegli Crea ruolo.

  1. Nella pagina Seleziona entità attendibile, seleziona Politica di fiducia personalizzata.
  2. Inserisci la seguente politica di fiducia personalizzata nell’editor e fornisci l’ID dell’account del consumatore SageMaker e il ruolo di esecuzione SageMaker che hai creato:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<<ID-ACCOUNT-CONSUMATORE-SageMaker>>:role/service-role/AmazonSageMaker-ExecutionRole-XXXXXX"
            },
            "Action": [
                "sts:AssumeRole",
                "sts:SetSourceIdentity"
           ]
            
        }
    ]
}

  1. Scegli Avanti.
  2. Nella pagina Aggiungi autorizzazioni richieste, scegli Crea politica.
  3. Aggiungi la seguente politica di esempio e apporta le modifiche necessarie in base alla tua configurazione.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GetRedshiftCredentials",
            "Effect": "Allow",
            "Action": "redshift:GetClusterCredentials",
            "Resource": [
                "arn:aws:redshift:<<nome-regione-redshift>>:<<ID-ACCOUNT-PRODUTTORE-REDSHIFT>>:dbname:<<nome-cluster-redshift>>/<<nome-db-redshift>>",
                "arn:aws:redshift:<<nome-regione-redshift>>:<<ID-ACCOUNT-PRODUTTORE-REDSHIFT>>:dbuser:<<nome-cluster-redshift>>/${redshift:DbUser}",
                "arn:aws:redshift:<<nome-regione-redshift>>:<<ID-ACCOUNT-PRODUTTORE-REDSHIFT>>:cluster:<<nome-cluster-redshift>>"
            ],
            "Condition": {
                "StringEquals": {
                    "redshift:DbUser": "${aws:SourceIdentity}"
                }
            }
        },
        {
            "Sid": "DynamicUserCreation",
            "Effect": "Allow",
            "Action": "redshift:CreateClusterUser",
            "Resource": "arn:aws:redshift:<<nome-regione-redshift>>:<<ID-ACCOUNT-PRODUTTORE-REDSHIFT>>:dbuser:<<nome-cluster-redshift>>/${redshift:DbUser}",
            "Condition": {
                "StringEquals": {
                    "redshift:DbUser": "${aws:SourceIdentity}"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "redshift:JoinGroup",
            "Resource": "arn:aws:redshift:<<nome-regione-redshift>>:<<ID-ACCOUNT-PRODUTTORE-REDSHIFT>>:dbgroup:<<nome-cluster-redshift>>/*"
        },
        {
            "Sid": "DataAPIPermissions",
            "Effect": "Allow",
            "Action": [
                "redshift-data:ExecuteStatement",
                "redshift-data:CancelStatement",
                "redshift-data:ListStatements",
                "redshift-data:GetStatementResult",
                "redshift-data:DescribeStatement",
                "redshift-data:ListDatabases",
                "redshift-data:ListSchemas",
                "redshift-data:ListTables",
                "redshift-data:DescribeTable"
            ],
            "Resource": "*"
        },
        {
            "Sid": "ReadPermissions",
            "Effect": "Allow",
            "Action": [
                "redshift:Describe*",
                "redshift:ViewQueriesInConsole"
            ],
            "Resource": "*"
        }
    ]
}

  1. Salva la policy aggiungendo un nome, ad esempio RedshiftROAPIUserAccess.

Il attributo SourceIdentity viene utilizzato per collegare l’identità dell’utente originale di SageMaker Studio all’utente del database Amazon Redshift. Le azioni dell’utente nell’account produttore possono quindi essere monitorate utilizzando CloudTrail e i registri di audit del database Amazon Redshift.

  1. Nella pagina Nome, revisione e creazione, inserisci un nome per il ruolo, rivedi le impostazioni e scegli Crea ruolo.

Aggiorna il ruolo IAM nell’account consumatore di SageMaker che SageMaker Studio assume nell’account produttore di Amazon Redshift

Per aggiornare il ruolo di esecuzione di SageMaker affinché assuma il ruolo appena creato, completa i seguenti passaggi:

  1. Apri la console IAM nell’account consumatore di SageMaker.
  2. Scegli Ruoli nel riquadro di navigazione, quindi scegli il ruolo di esecuzione di SageMaker che abbiamo creato (AmazonSageMaker-ExecutionRole-*).
  3. Nella sezione Policy delle autorizzazioni, nel menu Aggiungi autorizzazioni, scegli Crea una policy inline.

  1. Nell’editor, nella scheda JSON, inserisci la seguente policy, dove <StudioRedshiftRoleARN> è l’ARN del ruolo che hai creato nell’account produttore di Amazon Redshift:
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "<StudioRedshiftRoleARN>"
    }
}

Puoi ottenere l’ARN del ruolo creato nell’account produttore di Amazon Redshift sulla console IAM, come mostrato nella seguente immagine.

  1. Scegli Revisiona policy.
  2. Per Nome, inserisci un nome per la tua policy.
  3. Scegli Crea policy.

Le tue policy di autorizzazione dovrebbero assomigliare all’immagine seguente.

Configurare una connessione di peering tra le VPC nell’account del produttore di Amazon Redshift e l’account del consumatore di SageMaker Studio

Per stabilire una comunicazione tra la VPC di SageMaker Studio e la VPC di Amazon Redshift, le due VPC devono essere collegate tramite il peering delle VPC. Seguire i seguenti passaggi per stabilire una connessione:

  1. In uno dei due account di Amazon Redshift o SageMaker, aprire la console di Amazon VPC.
  2. Nel riquadro di navigazione, scegliere Connessioni di peering, quindi scegliere Crea connessione di peering.
  3. Per Nome, inserire un nome per la connessione.
  4. In Seleziona una VPC locale da collegare, scegliere una VPC locale.
  5. In Seleziona un’altra VPC da collegare, specificare un’altra VPC nella stessa regione e in un altro account.
  6. Scegliere Crea connessione di peering.

  1. Revisionare la connessione di peering delle VPC e scegliere Accetta richiesta per attivarla.

Dopo che la connessione di peering delle VPC è stata stabilita con successo, creare percorsi sia nelle VPC di SageMaker che di Amazon Redshift per completare la connettività tra di esse.

  1. Nell’account di SageMaker, aprire la console di Amazon VPC.
  2. Scegliere Tabelle di routing nel riquadro di navigazione, quindi scegliere la VPC associata a SageMaker e modificare i percorsi.
  3. Aggiungere il CIDR per la VPC di destinazione di Amazon Redshift e l’obiettivo come connessione di peering.
  4. Inoltre, aggiungere un gateway NAT.
  5. Scegliere Salva modifiche.

  1. Nell’account di Amazon Redshift, aprire la console di Amazon VPC.
  2. Scegliere Tabelle di routing nel riquadro di navigazione, quindi scegliere la VPC associata ad Amazon Redshift e modificare i percorsi.
  3. Aggiungere il CIDR per la VPC di destinazione di SageMaker e l’obiettivo come connessione di peering.
  4. Inoltre, aggiungere un gateway Internet.
  5. Scegliere Salva modifiche.

È possibile connettersi a SageMaker Studio dalla propria VPC tramite un endpoint di interfaccia nella propria VPC anziché connettersi tramite Internet. Quando si utilizza un endpoint di interfaccia VPC, la comunicazione tra la propria VPC e l’API o l’esecuzione di SageMaker avviene interamente e in modo sicuro all’interno della rete AWS.

  1. Per creare un endpoint di VPC, nell’account di SageMaker, aprire la console VPC.
  2. Scegliere Endpoint nel riquadro di navigazione, quindi scegliere Crea endpoint.
  3. Specificare la VPC di SageMaker, le relative subnet e i gruppi di sicurezza appropriati per consentire il traffico NFS in ingresso e in uscita per il dominio dei notebook di SageMaker, quindi scegliere Crea endpoint di VPC.

Interrogare Amazon Redshift in SageMaker Studio nell’account del consumatore

Dopo che tutte le connessioni di rete sono state stabilitate con successo, seguire i passaggi in questa sezione per connettersi al cluster di Amazon Redshift nell’account del consumatore di SageMaker Studio utilizzando la libreria AWS SDK per pandas:

  1. In SageMaker Studio, creare un nuovo notebook.
  2. Se il pacchetto AWS SDK per pandas non è installato, è possibile installarlo utilizzando quanto segue:
!pip install awswrangler #AWS SDK for pandas

Questa installazione non è persistente e verrà persa se l’app KernelGateway viene eliminata. I pacchetti personalizzati possono essere aggiunti come parte di una configurazione del ciclo di vita.

  1. Inserire il seguente codice nella prima cella ed eseguire il codice. Sostituire i valori di RoleArn e region_name in base alle impostazioni del proprio account:
import boto3
import awswrangler as wr
import pandas as pd
from datetime import datetime
import json
sts_client = boto3.client('sts')

# Chiamare il metodo assume_role dell'oggetto STSConnection e passare il ruolo
# ARN e un nome di sessione del ruolo.
assumed_role_object=sts_client.assume_role(
    RoleArn="arn:aws:iam::<<REDSHIFT-PRODUCER-ACCOUNT-ID>>:role/<<redshift-account-role>>",
    RoleSessionName="RedshiftSession"
)
credentials=assumed_role_object['Credentials']

# Utilizzare le credenziali temporanee restituite da AssumeRole per creare una
# connessione ad Amazon S3
redshift_session=boto3.Session(
    aws_access_key_id=credentials['AccessKeyId'],
    aws_secret_access_key=credentials['SecretAccessKey'],
    aws_session_token=credentials['SessionToken'],
    region_name="<<redshift-region-name>>",
)
  1. Inserire il seguente codice in una nuova cella ed eseguire il codice per ottenere il nome del profilo utente corrente di SageMaker:
def get_userprofile_name():
    metadata_file_path = '/opt/ml/metadata/resource-metadata.json'
    with open(metadata_file_path, 'r') as logs:
        metadata = json.load(logs)
    return metadata.get("UserProfileName")
  1. Inserire il seguente codice in una nuova cella ed eseguire il codice:
con_redshift = wr.redshift.connect_temp(
    cluster_identifier="<<redshift-cluster-name>>",
    database="<<redshift-db-name>>",
    user=get_userprofile_name(),
    auto_create=True,
    db_groups=[<<list-redshift-user-group>>],
    boto3_session = redshift_session
)

Per interrogare correttamente Amazon Redshift, l’amministratore del database deve assegnare al nuovo utente creato le autorizzazioni di lettura necessarie all’interno del cluster Amazon Redshift nell’account del produttore.

  1. Inserire il seguente codice in una nuova cella, aggiornare la query in modo da corrispondere alla tabella Amazon Redshift e eseguire la cella. Questo dovrebbe restituire correttamente i record per ulteriori elaborazioni e analisi dei dati.
df = wr.redshift.read_sql_query(
    sql="SELECT * FROM users",
    con=con_redshift
)

Ora è possibile iniziare a creare le trasformazioni e le analisi dei dati in base alle esigenze aziendali.

Disinstallazione

Per disinstallare le risorse al fine di evitare costi ricorrenti, eliminare i punti di accesso VPC SageMaker, il cluster Amazon Redshift e le app, gli utenti e il dominio di SageMaker Studio. Eliminare anche eventuali secchi S3 e oggetti creati.

Conclusione

In questo post abbiamo mostrato come stabilire una connessione tra account tra Amazon Redshift privato e le VPC di SageMaker Studio in account diversi utilizzando il VPC peering e accedere ai dati di Amazon Redshift in SageMaker Studio utilizzando il chaining dei ruoli IAM, registrando anche l’identità dell’utente quando l’utente ha accesso ad Amazon Redshift da SageMaker Studio. Con questa soluzione, si elimina la necessità di spostare manualmente i dati tra gli account per accedere ai dati. Abbiamo anche illustrato come accedere al cluster Amazon Redshift utilizzando la libreria AWS SDK per pandas in SageMaker Studio e preparare i dati per i casi d’uso di ML.

Per ulteriori informazioni su Amazon Redshift e SageMaker, fare riferimento alla Guida dello sviluppatore del database Amazon Redshift e alla Documentazione di Amazon SageMaker.