En utilisant AWS re:Post, vous acceptez les AWS re:Post Conditions d’utilisation

Comment puis-je créer une fonction Lambda entre comptes pour accéder à Amazon Redshift depuis un autre compte ?

Lecture de 5 minute(s)
0

Je souhaite créer une fonction AWS Lambda entre comptes pour accéder à Amazon Redshift depuis un autre compte AWS.

Résolution

Créer un VPC, un groupe de sous-réseaux et un cluster Amazon Redshift privé dans votre compte Amazon Redshift

Effectuez les étapes suivantes depuis votre compte Amazon Redshift :

  1. Créez un cloud privé virtuel (VPC) avec un sous-réseau privé.
  2. Créez un groupe de sous-réseaux de cluster, puis ajoutez le VPC et le sous-réseau au groupe de sous-réseaux de cluster.
  3. Créez un cluster Amazon Redshift privé, puis ajoutez le VPC et le groupe de sous-réseaux du cluster au cluster.
  4. Utilisez la console AWS Secrets Manager pour créer un secret pour votre fonction Amazon Redshift, puis nommez-le.
  5. Créez un rôle AWS Identity and Access Management (IAM) pour permettre à Lambda d'accéder à Amazon Redshift. Dans l'exemple suivant, le rôle est nommé cross-account-child :
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": [
                    "secretsmanager:*",
                    "redshift-data:*",
                    "kms:*",
                    "redshift:*",
                    "sts:*"
                ],
                "Resource": "*"
            }
        ]
    }
    Important : Lorsque vous créez des politiques IAM, il est recommandé de n'accorder que les autorisations nécessaires à l'exécution d'une tâche spécifique. Pour plus d'informations, reportez-vous à la section Appliquer des autorisations de moindre privilège.
  6. Créez une relation de confiance pour permettre au rôle de votre compte Lambda d'assumer le rôle dans votre compte Amazon Redshift :
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::Account_B:role/lambdaArticle"
                },
                "Action": "sts:AssumeRole"
            },
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "redshift.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    Remarque : Dans l'exemple précédent, remplacez Account_B par le numéro de compte Lambda. La relation de confiance permet également à Lambda d'accéder à Amazon Redshift depuis le même compte.

Créer une relation de confiance et une politique IAM dans votre compte Lambda

Effectuez les étapes suivantes depuis votre compte Lambda :

  1. Créez une relation de confiance pour permettre au rôle du compte Lambda d'endosser le rôle dans le compte Amazon Redshift :

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": [
                        "redshift.amazonaws.com",
                        "lambda.amazonaws.com"
                    ]
                },
                "Action": "sts:AssumeRole"
            },
            {
                "Sid": "AssumeRole",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::Account_A:role/cross-account-child"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }

    Remarque : Remplacez Account_A par votre numéro de compte Amazon Redshift. La relation de confiance permet également à Lambda d'accéder à Amazon Redshift.

  2. Créez une politique IAM avec les autorisations suivantes :

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": [
                    "secretsmanager:*",
                    "redshift-data:*",
                    "kms:*",
                    "redshift:*",
                    "sts:*"
                ],
                "Resource": "*"
            }
        ]
    }
  3. Ajoutez la politique gérée AWSLambdaVPCAccessExecutionRole au rôle Lambda.

Créer votre fonction Lambda

Pour créer une fonction Lambda qui interroge votre cluster Amazon Redshift, procédez comme suit :

  1. Ouvrez la console Lambda.
  2. Sélectionnez Créer une fonction.
  3. Sélectionnez Créer à partir de zéro.
  4. Saisissez les informations suivantes :
    Nom de la fonction : Saisissez un nom personnalisé.
    Exécution : Saisissez votre environnement de code. Les exemples de cette résolution sont compatibles avec Python 3.9.
    Architecture : Saisissez l'architecture de votre système. Les exemples de cette résolution sont compatibles avec x86_64.
    Autorisations : Sélectionnez Créer un nouveau rôle avec des autorisations Lambda de base.
  5. Sélectionnez Créer une fonction.

Définir les autorisations pour votre fonction Lambda

Procédez comme suit :

  1. Ouvrez la console Lambda.
  2. Sélectionnez Configuration.
  3. Sélectionnez Autorisations.
  4. Choisissez le rôle de la fonction Lambda.
    Remarque : Il est recommandé de n'accorder que les autorisations nécessaires à l'exécution d'une tâche. Pour plus d'informations, reportez-vous à la section Appliquer des autorisations de moindre privilège.
  5. Sélectionnez Code.
  6. Saisissez le code Lambda suivant dans la zone Code :
    Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
    
    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so.
    
    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR APARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTIONOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    
    import os
    import json
    import boto3
    import botocore
    import botocore.session as bc
    from botocore.client
    import Config
    
    print('Loading function')
    secret_name=os.environ['SecretId']
    
    def lambda_handler(event, context):
        sts_connection = boto3.client('sts')
        acct_b = sts_connection.assume_role(
            RoleArn="arn:aws:iam::Account_A:role/cross-account-child",  
            RoleSessionName="cross_acct_lambda"
        )
    
        ACCESS_KEY = acct_b['Credentials']['AccessKeyId']
        SECRET_KEY = acct_b['Credentials']['SecretAccessKey']
        SESSION_TOKEN = acct_b['Credentials']['SessionToken']
    
        client = boto3.client(
            'secretsmanager',
            aws_access_key_id=ACCESS_KEY,
            aws_secret_access_key=SECRET_KEY,
            aws_session_token=SESSION_TOKEN,
        )
    
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
         )
    
        secret_arn=get_secret_value_response['ARN']
        print(secret_arn)
        secret = get_secret_value_response['SecretString']
        print(secret)
        secret_json = json.loads(secret)
        cluster_id=secret_json['dbClusterIdentifier']
        print(cluster_id)
    
        rsd = boto3.client(
            'redshift-data',
            aws_access_key_id=ACCESS_KEY,
            aws_secret_access_key=SECRET_KEY,
            aws_session_token=SESSION_TOKEN,
        )
        resp = rsd.execute_statement(
        SecretArn=secret_arn,
        ClusterIdentifier=cluster_id,
        Database="dev",          
        Sql="create table public.lambda_func (id int);")
        return "Hello from Lambda"
    Remarque : Remplacez dev par le nom de votre base de données. Ajoutez une variable d'environnement nommée SecretId dans la section de configuration de la fonction Lambda. Pour RoleArn, ajoutez l'ARN du secret depuis votre compte Amazon Redshift. Remplacez create table public.lambda_func par la requête que vous souhaitez exécuter pour recevoir une réponse.
AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an