Share Your AWS re:Post Experience - Quick 3 Question Survey
Help us improve AWS re:Post! We're interested in understanding how you use re:Post and its impact on your AWS journey. Please take a moment to complete our brief 3-question survey.
別のアカウントで Amazon Redshift にアクセスするためのクロスアカウント Lambda 関数を作成する方法を教えてください。
所要時間3分
0
別の AWS アカウントにある Amazon Redshift にアクセスするためのクロスアカウント AWS Lambda 関数を作成したいです。
解決策
Amazon Redshift アカウントに VPC、サブネットグループ、プライベート Amazon Redshift クラスターを作成する
Amazon Redshift アカウントから以下のステップを実行します。
- プライベートサブネットを使用して仮想プライベートクラウド (VPC) を作成します。
- クラスターサブネットグループを作成し、VPC とサブネットをクラスターサブネットグループに追加します。
- プライベート Amazon Redshift クラスターを作成し、VPC とクラスターサブネットグループをクラスターに追加します。
- AWS シークレットマネージャーコンソールを使用して 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 コンソールを開きます。
- [関数の作成] を選択します。
- [一から作成] を選択します。
- 次の情報を入力します。
関数名: カスタム名を入力します。
ランタイム: コード環境を入力します。この解決策での例は、Python 3.9 と互換性があります。
アーキテクチャ: システムアーキテクチャを入力します。この解決策での例は、x86_64 と互換性があります。
アクセス許可: [基本的な Lambda アクセス許可を持つ新しいロールを作成する] を選択します。 - [関数の作成] を選択します。
Lambda 関数にアクセス許可を設定する
次の手順を実行します。
- Lambda コンソールを開きます。
- [設定] を選択します。
- [アクセス許可] を選択します。
- Lambda 関数ロールを選択します。
注: タスクの実行に必要なアクセス許可のみを付与するのがベストプラクティスです。詳細については、「最小特権アクセス許可を適用する」を参照してください。 - [コード] を選択します。
- [コード] ボックスに次の 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年前
コメントはありません
関連するコンテンツ
- 質問済み 2年前lg...
- AWS公式更新しました 1年前
- AWS公式更新しました 2年前
- AWS公式更新しました 3ヶ月前
- AWS公式更新しました 2ヶ月前