如何创建跨账户 Lambda 函数以在其他账户中访问 Amazon Redshift?
3 分钟阅读
0
我想创建跨账户 AWS Lambda 函数来访问其他 AWS 账户中的 Amazon Redshift。
解决方法
在您的 Amazon Redshift 账户中创建 VPC、子网组和私有 Amazon Redshift 集群
使用您的 Amazon Redshift 账户完成以下步骤:
- 使用私有子网创建虚拟私有云 (VPC)。
- 创建集群子网组,然后将 VPC 和子网添加到集群子网组。
- 创建私有 Amazon Redshift 集群,然后将 VPC 和集群子网组添加到该集群。
- 使用 AWS Secrets Manager 控制台为您的 Amazon Redshift 函数创建一个密钥,然后为您的密钥命名。
- 创建 AWS Identity and Access Management (IAM) 角色以允许 Lambda 访问 Amazon Redshift。在以下示例中,该角色被命名为 cross-account-child:
**重要事项:**在创建 IAM 策略时,最佳做法是仅授予执行特定任务所需的权限。有关详细信息,请参阅应用最低权限许可。{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "secretsmanager:*", "redshift-data:*", "kms:*", "redshift:*", "sts:*" ], "Resource": "*" } ] }
- 创建信任关系,以允许您的 Lambda 账户中的角色代入您的 Amazon Redshift 账户中的角色:
**注意:**在前面的示例中,将 Account_B 替换为 Lambda 账号。信任关系还允许 Lambda 从同一个账户访问 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" } ] }
在您的 Lambda 账户中创建信任关系和 IAM 策略
从您的 Lambda 账户完成以下步骤:
-
创建信任关系以允许 Lambda 账户中的角色代入 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" } ] }
**注意:**将 Account_A 替换为您的 Amazon Redshift 账号。信任关系还允许 Lambda 访问 Amazon Redshift。
-
创建具有以下权限的 IAM 策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "secretsmanager:*", "redshift-data:*", "kms:*", "redshift:*", "sts:*" ], "Resource": "*" } ] }
-
将 AWSLambdaVPCAccessExecutionRole 托管式策略添加到 Lambda 角色中。
创建 Lambda 函数
要创建用于查询您的 Amazon Redshift 集群的 Lambda 函数,请完成以下步骤:
- 打开 Lambda 控制台。
- 选择 Create function(创建函数)。
- 选择 Author from Scratch(从头开始编写)。
- 添加以下信息:
**函数名称:**输入自定义名称。
**运行时:**输入您的代码环境。此解决方法中的示例与 Python 3.9 兼容。
**架构:**输入您的系统架构。此解决方法中的示例与 x86_64 兼容。
**权限:**选择 Create a new role with basic Lambda permissions(创建具有基本 Lambda 权限的新角色)。 - 选择 Create function(创建函数)。
为您的 Lambda 函数设置权限
完成以下步骤:
- 打开 Lambda 控制台。
- 选择 Configuration(配置)。
- 选择 Permissions(权限)。
- 选择 Lambda 函数角色。
**注意:**最佳做法是仅授予执行任务所需的权限。有关详细信息,请参阅应用最低权限许可。 - 选择 Code(代码)。
- 在 Code(代码)框中输入以下 Lambda 代码:
**注意:**将 dev 替换为您的数据库名称。在 Lambda 函数的配置部分中添加名为 SecretId 的环境变量。对于 RoleArn,请从您的 Amazon Redshift 账户中添加秘密的 ARN。将 create table public.lambda_func 替换为要运行以接收其响应的查询。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"
AWS 官方已更新 1 年前
没有评论
相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前