Accès Kinesis inter-comptes avec une politique AssumeRole
Dans AWS, vous pouvez configurer l'accès inter-comptes, afin que le calcul dans un compte puisse accéder aux services AWS dans un autre compte. Une façon d'accorder l'accès, décrite dans Tutoriel : configurer l'accès S3 avec un profil d'instance, consiste à accorder à un compte un accès direct aux services d'un autre compte. Une autre façon d'accorder l'accès à d'autres services consiste à autoriser un compte à assumer un rôle dans un autre compte.
Considérer le compte AWS A avec l'ID de compte <deployment-acct-id> et le compte AWS B avec le numéro de compte <kinesis-owner-acct-id>. Le compte A est utilisé lors du déploiement de votre workspace Databricks: les services EC2 sont gérés par ce compte. Kinesis est géré par le compte B.
Cet article fournit les étapes pour configurer le Compte A afin qu'il utilise l'action AWS AssumeRole pour accéder à Kinesis dans le Compte B en tant que rôle dans le Compte B. Pour activer cet accès, vous effectuez la configuration dans le Compte A et le Compte B dans les paramètres d'administration de Databricks, lorsque vous configurez un cluster Databricks, et lorsque vous exécutez un notebook qui accède à Kinesis.
Exigences
Accès administrateur AWS aux rôles et politiques IAM dans le compte AWS du déploiement Databricks et le compte AWS du service Kinesis.
Étape 1 : configurer un rôle inter-comptes dans le compte Kinesis
-
Dans votre compte AWS Kinesis, accédez au service IAM : cliquez sur l'onglet tab .
-
Cliquez sur Créer un rôle . Dans le panneau Sélectionner le type d’entité approuvée, cliquez sur Autre compte AWS . Collez l'ID de compte de votre compte AWS Databricks,
<deployment-acct-id>. Vous pouvez éventuellement spécifier un ID externe, mais ce n'est pas obligatoire. -
Cliquez sur Suivant : autorisations et accordez à ce rôle l'autorisation d'accéder à Kinesis. Vous pouvez fournir votre propre JSON ou utiliser la politique AmazonKinesisFullAccess .
-
Cliquez
KinesisCrossAccountRolesur **Suivant : Vérifier** et donnez un nom au rôle, par exemple. -
Cliquez sur Créer un rôle . La liste des rôles s'affiche.
-
Dans la liste des rôles, cliquez sur
KinesisCrossAccountRoleet vérifiez que le compte approuvé contient une politique JSON telle que :JSON{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": ["arn:aws:iam::<deployment-acct-id>:root"],
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
} -
Copiez l'ARN du rôle, par exemple :
arn:aws:iam::<kinesis-owner-acct-id>:role/KinesisCrossAccountRole.
Étape 2 : Configurez l'Assumation de Rôle dans le compte de déploiement Databricks
-
Dans votre compte AWS de déploiement Databricks, accédez au service IAM et cliquez sur l'onglet tab .
-
Cliquez sur Créer un rôle . Dans le panneau Sélectionner le type d'entité de confiance, cliquez sur service AWS et cliquez sur le service EC2 .
-
Cliquez sur **Suivant : autorisations**.
-
Cliquez
DatabricksToKinesisAssumeRolesur **Suivant : Vérifier** et donnez un nom au rôle, par exemple. -
Cliquez sur Créer un rôle . La liste des rôles s'affiche.
-
Dans la liste Rôles, cliquez sur
DatabricksToKinesisAssumeRole. -
Dans l'onglet Autorisations , cliquez sur
.
-
Cliquez sur l'onglet JSON .
-
Copiez cette politique et collez l’ARN du rôle de votre
KinesisCrossAccountRoleà partir de l’étape 1 dans le champ Ressource :JSON{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1487884001000",
"Effect": "Allow",
"Action": ["sts:AssumeRole"],
"Resource": ["arn:aws:iam::<kinesis-owner-acct-id>:role/KinesisCrossAccountRole"]
}
]
} -
Cliquez sur Vérifier la politique .
-
Dans le champ Nom, saisissez un nom de politique, par exemple
DatabricksToKinesisAssumeRole. -
Cliquez sur Créer une politique .
-
Sélectionner
DatabricksToKinesisAssumeRole. Enregistrez l'ARN du profil d'instance pour l'utiliser à l'étape 3, et enregistrez l'ARN du rôle pour l'utiliser à l'étape suivante. -
Mettez à jour la politique du rôle utilisé pour déployer votre workspace Databricks et ajoutez l'action
iam:PassRoleà la politique. L'actioniam:PassRoledevrait utiliser l'ARN du rôle pour votreDatabricksToKinesisAssumeRoleque vous venez de créer à cette étape. Après l'enregistrement, vous devriez avoir une politique comme celle-ci :JSON{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1403287045000",
"Effect": "Allow",
"Action": [
"ec2:AssociateDhcpOptions",
"ec2:AssociateRouteTable",
"ec2:AttachInternetGateway",
"ec2:AttachVolume"
],
"Resource": ["*"]
},
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": ["arn:aws:iam::<deployment-acct-id>:role/DatabricksToKinesisAssumeRole"]
}
]
}
Étape 3 : Ajoutez le profil d'instance DatabricksToKinesisAssumeRole à Databricks
- Accédez à la page de paramètres.
- Cliquez sur l' Instance Profiles tab .
- Ajoutez le profil d'instance
DatabricksToKinesisAssumeRoleen utilisant l'ARN du profil d'instance que vous avez enregistré à l'étape 2,arn:aws:iam::<deployment-acct-id>:instance-profile/DatabricksToKinesisAssumeRole.
Étape 4 : Créez un cluster avec le profil d'instance
- Sélectionnez ou créez un cluster.
- Ouvrez la section Avancée .
- Sous l'onglet Instances , sélectionnez le profil d'instance que vous avez ajouté à l'étape 3
DatabricksToKinesisAssumeRole. - Start le cluster.
Étape 5 : Valider la connexion à Kinesis
-
Créez un Notebook et associez-le au cluster que vous avez créé à l'étape 4.
-
Configurez l'option
roleArndans la méthode SparkreadStreampour utiliser le rôle d'assumé spécifié (KinesisCrossAccountRole) à partir du rôle IAM que vous avez attaché à votre cluster (DatabricksToKinesisAssumeRole) :Pythonkinesis = spark.readStream \
.format("kinesis") \
.option("streamName", "testStream") \
.option("region", "us-east-1") \
.option("roleArn", "arn:aws:iam::<kinesis-owner-acct-id>:role/KinesisCrossAccountRole") \
.option("initialPosition", "earliest") \
.load()
display(kinesis)L'exemple de code suppose que le nom du Stream Kinesis est
testStreamet qu'il se trouve dans la régionus-east-1. Si vous avez crééKinesisCrossAccountRoleavec un ID externe, ajoutez l'option suivante :Python.option("roleExternalId", "myExternalCode")Si vous avez créé un Endpoint Virtual Private Cloud (VPC) pour le service Kinesis, ajoutez l'option suivante. Remplacez
<region>par la région AWS pour l'Endpoint Virtual Private Cloud (VPC) :Python.option("stsEndpoint", "sts.<region>.amazonaws.com") -
Vérifiez un résultat valide comme le suivant :
