Cookie の設定を選択する

当社は、当社のサイトおよびサービスを提供するために必要な必須 Cookie および類似のツールを使用しています。当社は、パフォーマンス Cookie を使用して匿名の統計情報を収集することで、お客様が当社のサイトをどのように利用しているかを把握し、改善に役立てています。必須 Cookie は無効化できませんが、[カスタマイズ] または [拒否] をクリックしてパフォーマンス Cookie を拒否することはできます。

お客様が同意した場合、AWS および承認された第三者は、Cookie を使用して便利なサイト機能を提供したり、お客様の選択を記憶したり、関連する広告を含む関連コンテンツを表示したりします。すべての必須ではない Cookie を受け入れるか拒否するには、[受け入れる] または [拒否] をクリックしてください。より詳細な選択を行うには、[カスタマイズ] をクリックしてください。

アカウント間で Amazon Redshift クラスターから Amazon S3 にデータをアンロードする - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

アカウント間で Amazon Redshift クラスターから Amazon S3 にデータをアンロードする

作成者: Andrew Kamel (AWS)

概要

アプリケーションをテストするときは、テスト環境に本番稼働用データを配置すると便利です。本番稼働用データを使用すると、開発中のアプリケーションをより正確に評価できます。

このパターンは、本番環境の Amazon Redshift クラスターから、Amazon Web Services () の開発環境の Amazon Simple Storage Service (Amazon S3) バケットにデータを抽出しますAWS。

DEV アカウントと PROD アカウントの両方をセットアップするパターン手順は次のとおりです。

  • 必要なリソース

  • AWS Identity and Access Management (IAM) ロール

  • Amazon Redshift 接続をサポートするサブネット、セキュリティグループ、仮想プライベートクラウド (VPC) のネットワーク調整

  • アーキテクチャをテストするための Python ランタイムを使用した AWS Lambda 関数の例

Amazon Redshift クラスターへのアクセスを許可するために、このパターンでは AWS Secrets Manager を使用して関連する認証情報を保存します。利点は、Amazon Redshift クラスターの場所を知ることなく、Amazon Redshift クラスターに直接接続するために必要なすべての情報があることです。さらに、シークレットの使用をモニタリングできます。

Secrets Manager に保存されているシークレットには、Amazon Redshift クラスターのホスト、データベース名、ポート、および関連する認証情報が含まれます。

このパターンを使用する際のセキュリティ上の考慮事項については、「ベストプラクティス」セクションを参照してください。

前提条件と制限

前提条件

機能制限

  • クエリするデータの量によっては、Lambda 関数がタイムアウトすることがあります。

    実行に最大 Lambda タイムアウト (15 分) よりも時間がかかる場合は、Lambda コードに非同期アプローチを使用します。このパターンのコード例では、Python 用の psycopg2 ライブラリを使用していますが、現在非同期処理をサポートしていません。

  • 一部の AWS のサービス はすべての で利用できるわけではありません AWS リージョン。利用可能なリージョンについては、AWS のサービス 「リージョン別」を参照してください。特定のエンドポイントについては、「サービスエンドポイントとクォータ」ページを参照し、サービスのリンクを選択します。

アーキテクチャ

次の図は、DEV アカウントと PROD アカウントを使用したターゲットアーキテクチャを示しています。

DEV アカウントの Lambda VPC と PROD アカウントの Amazon Redshift VPC。

この図表は、次のワークフローを示しています:

  1. DEV アカウントの Lambda 関数は、PROD アカウントの Secrets Manager の Amazon Redshift 認証情報にアクセスするために必要な IAM ロールを引き受けます。

    次に、Lambda 関数は Amazon Redshift クラスターシークレットを取得します。

  2. DEV アカウントの Lambda 関数は、この情報を使用して、ピアリング接続された VPCs を介して PROD アカウントの Amazon Redshift クラスターに接続します。

    次に、Lambda 関数は、PROD アカウントの Amazon Redshift クラスターをクエリする unload コマンドを送信します。

  3. PROD アカウントの Amazon Redshift クラスターは、DEV アカウントの S3 バケットにアクセスするための関連する IAM ロールを引き受けます。

    Amazon Redshift クラスターは、クエリされたデータを DEV アカウントの S3 バケットにアンロードします。

Amazon Redshift からのデータのクエリ

次の図は、Amazon Redshift 認証情報を取得し、Amazon Redshift クラスターに接続するために使用するロールを示しています。ワークフローは Lambda 関数によって開始されます。

アカウント間でロールを引き受ける 3 ステップのプロセス。

この図表は、次のワークフローを示しています:

  1. CrossAccount-SM-Read-Role DEV アカウントの は、PROD SM-Read-Role アカウントの を引き受けます。

  2. SM-Read-Role ロールは、アタッチされたポリシーを使用して Secrets Manager からシークレットを取得します。

  3. 認証情報は、Amazon Redshift クラスターへのアクセスに使用されます。

Amazon S3 へのデータのアップロード

次の図は、データを抽出して Amazon S3 にアップロードするためのクロスアカウント読み取り/書き込みプロセスを示しています。ワークフローは Lambda 関数によって開始されます。パターンは Amazon Redshift の IAM ロールを連鎖します。Amazon Redshift クラスターから送信されるアンロードコマンドは、 を引き受けCrossAccount-S3-Write-Role、次に を引き受けますS3-Write-Role。このロールチェーンは、Amazon Redshift に Amazon S3 へのアクセスを許可します。

認証情報の取得、Amazon Redshift へのアクセス、Amazon S3 へのデータのアップロードを行うロール。

ワークフローには以下のステップが含まれます。

  1. CrossAccount-SM-Read-Role DEV アカウントの は、PROD SM-Read-Role アカウントの を引き受けます。

  2. は、Secrets Manager から Amazon Redshift 認証情報SM-Read-Roleを取得します。

  3. Lambda 関数は Amazon Redshift クラスターに接続し、クエリを送信します。

  4. Amazon Redshift クラスターは を引き受けますCrossAccount-S3-Write-Role

  5. は、DEV アカウントの をCrossAccount-S3-Write-Role引き受けS3-Write-Roleます。

  6. クエリ結果は、DEV アカウントの S3 バケットにアンロードされます。

ツール

AWS のサービス

  • AWS Key Management Service (AWS KMS) は、データの保護に役立つ暗号化キーの作成と制御に役立ちます。

  • AWS Lambda は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

  • Amazon Redshift は、 クラウド内でのフルマネージド型、ペタバイト規模のデータウェアハウスサービスです。

  • AWS Secrets Manager を使用すると、コード内のハードコードされた認証情報 (パスワードを含む) を Secrets Manager への API コールで置き換えて、プログラムでシークレットを取得することができます。

  • Amazon Simple Storage Service (Amazon S3) は、データ量にかかわらず、保存、保護、取得する上で役立つクラウドベースのオブジェクトストレージサービスです。

コードリポジトリ

このパターンのコードは、GitHub の unload-redshift-to-s3-python リポジトリで入手できます。

ベストプラクティス

セキュリティに関する免責事項

このソリューションを実装する前に、以下の重要なセキュリティ上の推奨事項を考慮してください。

  • 開発用アカウントと本番稼働用アカウントを接続すると、範囲が拡大し、全体的なセキュリティ体制が軽減される可能性があることに注意してください。このソリューションを一時的にのみデプロイし、必要なデータを抽出してから、デプロイされたリソースをすぐに破棄することをお勧めします。リソースを破棄するには、Lambda 関数を削除し、このソリューション用に作成された IAM ロールとポリシーを削除し、アカウント間で付与されたネットワークアクセスを取り消す必要があります。

  • 本番環境から開発環境にデータをコピーする前に、セキュリティチームとコンプライアンスチームに相談してください。個人を特定できる情報 (PII)、保護対象の医療情報 (PHI)、その他の機密データや規制対象のデータは、通常、この方法でコピーしないでください。公開されている非機密情報 (例: 店舗のフロントエンドからの公開株式データ) のみをコピーします。可能な限り本番データを使用する代わりに、データのトークン化または匿名化、または合成テストデータの生成を検討してください。AWS セキュリティ原則の 1 つは、データを遠ざけることです。つまり、デベロッパーは本番稼働用アカウントでオペレーションを実行しないでください。

  • 開発アカウントの Lambda 関数へのアクセスを制限します。Lambda 関数は、本番環境の Amazon Redshift クラスターからデータを読み取ることができるためです。

  • 本番環境の中断を回避するには、次の推奨事項を実装します。

    • テストおよび開発アクティビティには、別の専用の開発アカウントを使用します。

    • 厳格なネットワークアクセスコントロールを実装し、アカウント間のトラフィックを必要なもののみに制限します。

    • 本番環境とデータソースへのアクセスをモニタリングおよび監査します。

    • 関連するすべてのリソースとサービスに最小特権のアクセスコントロールを実装します。

    • AWS Secrets Manager シークレットや IAM ロールのアクセスキーなどの認証情報を定期的に確認して更新します。

  • この記事で使用されているサービスについては、次のセキュリティドキュメントを参照してください。

本番データとリソースにアクセスする場合、セキュリティが最優先事項です。常にベストプラクティスに従い、最小特権のアクセスコントロールを実装し、セキュリティ対策を定期的に見直して更新します。

エピック

タスク説明必要なスキル

Amazon Redshift クラスターのシークレットを作成します。

Amazon Redshift クラスターのシークレットを作成するには、次の手順を実行します。

  1. PROD アカウントで にサインインし AWS Management Console、https://console.aws.amazon.com/secretsmanager/. で Secrets Manager コンソールを開きます。

  2. 新しいシークレットを保存する を選択します。

  3. Amazon Redshift データウェアハウスの認証情報を選択します。

  4. ユーザー名パスワードに、インスタンスの値を入力し、暗号化キーの値を確認または選択します。

  5. シークレットがアクセスする Amazon Redshift データウェアハウスを選択します。

  6. シークレット名Redshift-Creds-Secretに を入力します。

  7. 残りの作成ステップをデフォルトの選択で完了し、保存を選択します。

  8. シークレットを表示し、シークレットを識別するために生成されたシークレット ARN 値を書き留めます。

DevOps エンジニア

Secrets Manager にアクセスするためのロールを作成します。

ロールを作成するには、次の手順を実行します。

  1. PROD アカウントで、https://console.aws.amazon.com/iam/. で IAM コンソールを開きます。

  2. [ポリシー] を選択します。

  3. [Create policy] を選択します。

  4. JSON タブを選択し、次のような IAM ポリシーを入力します。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetResourcePolicy", "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret", "secretsmanager:ListSecretVersionIds" ], "Resource": [ "<Redshift-Creds-Secret-ARN>" ] }, { "Effect": "Allow", "Action": "secretsmanager:ListSecrets", "Resource": "*" } ] }

    を、Amazon Redshift クラスターの情報と認証情報を含む Secrets Manager シークレットの Amazon リソースネーム (ARN) Redshift-Creds-Secret-ARNに置き換えます。

DevOps エンジニア

Amazon Redshift からデータをクエリする

タスク説明必要なスキル

Amazon Redshift クラスターのシークレットを作成します。

Amazon Redshift クラスターのシークレットを作成するには、次の手順を実行します。

  1. PROD アカウントで にサインインし AWS Management Console、https://console.aws.amazon.com/secretsmanager/. で Secrets Manager コンソールを開きます。

  2. 新しいシークレットを保存する を選択します。

  3. Amazon Redshift データウェアハウスの認証情報を選択します。

  4. ユーザー名パスワードに、インスタンスの値を入力し、暗号化キーの値を確認または選択します。

  5. シークレットがアクセスする Amazon Redshift データウェアハウスを選択します。

  6. シークレット名Redshift-Creds-Secretに を入力します。

  7. 残りの作成ステップをデフォルトの選択で完了し、保存を選択します。

  8. シークレットを表示し、シークレットを識別するために生成されたシークレット ARN 値を書き留めます。

DevOps エンジニア

Secrets Manager にアクセスするためのロールを作成します。

ロールを作成するには、次の手順を実行します。

  1. PROD アカウントで、https://console.aws.amazon.com/iam/. で IAM コンソールを開きます。

  2. [ポリシー] を選択します。

  3. [Create policy] を選択します。

  4. JSON タブを選択し、次のような IAM ポリシーを入力します。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetResourcePolicy", "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret", "secretsmanager:ListSecretVersionIds" ], "Resource": [ "<Redshift-Creds-Secret-ARN>" ] }, { "Effect": "Allow", "Action": "secretsmanager:ListSecrets", "Resource": "*" } ] }

    を、Amazon Redshift クラスターの情報と認証情報を含む Secrets Manager シークレットの Amazon リソースネーム (ARN) Redshift-Creds-Secret-ARNに置き換えます。

DevOps エンジニア
タスク説明必要なスキル

S3 バケットにアクセスするロールを作成します。

S3 バケットにアクセスするためのロールを作成するには、次の手順を実行します。

  1. DEV アカウントで、IAM コンソールを開きます。

  2.  [ポリシー] を選択します。

  3. [Create policy] を選択します。

  4.  JSON タブを選択し、次のような IAM ポリシーを入力します。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "kmsstmt", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:GenerateDataKey" ], "Resource": [ "<kms-key-arn>" ] }, { "Sid": "s3stmt", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::mybucket", "arn:aws:s3:::mybucket/*" ] } ] }

    を、アクセスする S3 バケットの名前mybucketに置き換えます。また、S3 バケットが暗号化されている場合は、 を S3 バケットの暗号化に使用される AWS Key Management Service (AWS KMS) キーの ARN kms-key-arnに置き換えます。それ以外の場合は、ポリシーの AWS KMS セクションは必要ありません。

  5. ポリシーの確認 を選択し、ポリシー名S3-Write-Policyとして と入力し、ポリシーの作成 を選択します。

  6. ナビゲーションペインで [Roles (ロール) ] を選択します。

  7.  [Create role] を選択します。

  8. 信頼されたエンティティロールで、カスタム信頼ポリシーを選択します。

  9. 次へ: アクセス許可を選択し、作成した S3-Write-Policy ポリシーを選択します。

  10. をロール名S3-Write-Roleとして入力し、ロールの作成を選択します。

DevOps エンジニア

Amazon Redshift ロールを作成します。

Amazon Redshift ロールを作成するには、次の手順を実行します。

  1. PROD アカウントで、IAM コンソールを開きます。

  2. [ポリシー] を選択します。

  3. [Create policy] を選択します。

  4. JSON タブを選択し、次のような IAM ポリシーを入力します。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountPolicy", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "S3-Write-Role-ARN" } ] }

    を DEV アカウントの S3-Write-Roleの ARN S3-Write-Role-ARNに置き換えます。

  5. ポリシーの確認 を選択し、ポリシー名S3-Write-Role-Assume-Policyとして と入力し、ポリシーの作成 を選択します。

  6. ナビゲーションペインで ロール を選択してから、ロールを作成する を選択します。

  7. 信頼されたエンティティタイプとして AWS サービスを選択し、RedshiftRedshift - カスタマイズ可能を選択します。

  8. 次へ: アクセス許可を選択し、作成した S3-Write-Role-Assume-Policy ポリシーを選択します。

  9. をロール名CrossAccount-S3-Write-Roleとして入力し、ロールの作成を選択します。

  10. IAM ロールを Amazon Redshift クラスターに関連付けます。

DevOps エンジニア

データを Simple Storage Service (Amazon S3) にアップロードする

タスク説明必要なスキル

S3 バケットにアクセスするロールを作成します。

S3 バケットにアクセスするためのロールを作成するには、次の手順を実行します。

  1. DEV アカウントで、IAM コンソールを開きます。

  2.  [ポリシー] を選択します。

  3. [Create policy] を選択します。

  4.  JSON タブを選択し、次のような IAM ポリシーを入力します。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "kmsstmt", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:GenerateDataKey" ], "Resource": [ "<kms-key-arn>" ] }, { "Sid": "s3stmt", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::mybucket", "arn:aws:s3:::mybucket/*" ] } ] }

    を、アクセスする S3 バケットの名前mybucketに置き換えます。また、S3 バケットが暗号化されている場合は、 を S3 バケットの暗号化に使用される AWS Key Management Service (AWS KMS) キーの ARN kms-key-arnに置き換えます。それ以外の場合は、ポリシーの AWS KMS セクションは必要ありません。

  5. ポリシーの確認 を選択し、ポリシー名S3-Write-Policyとして と入力し、ポリシーの作成 を選択します。

  6. ナビゲーションペインで [Roles (ロール) ] を選択します。

  7.  [Create role] を選択します。

  8. 信頼されたエンティティロールで、カスタム信頼ポリシーを選択します。

  9. 次へ: アクセス許可を選択し、作成した S3-Write-Policy ポリシーを選択します。

  10. をロール名S3-Write-Roleとして入力し、ロールの作成を選択します。

DevOps エンジニア

Amazon Redshift ロールを作成します。

Amazon Redshift ロールを作成するには、次の手順を実行します。

  1. PROD アカウントで、IAM コンソールを開きます。

  2. [ポリシー] を選択します。

  3. [Create policy] を選択します。

  4. JSON タブを選択し、次のような IAM ポリシーを入力します。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountPolicy", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "S3-Write-Role-ARN" } ] }

    を DEV アカウントの S3-Write-Roleの ARN S3-Write-Role-ARNに置き換えます。

  5. ポリシーの確認 を選択し、ポリシー名S3-Write-Role-Assume-Policyとして と入力し、ポリシーの作成 を選択します。

  6. ナビゲーションペインで ロール を選択してから、ロールを作成する を選択します。

  7. 信頼されたエンティティタイプとして AWS サービスを選択し、RedshiftRedshift - カスタマイズ可能を選択します。

  8. 次へ: アクセス許可を選択し、作成した S3-Write-Role-Assume-Policy ポリシーを選択します。

  9. をロール名CrossAccount-S3-Write-Roleとして入力し、ロールの作成を選択します。

  10. IAM ロールを Amazon Redshift クラスターに関連付けます。

DevOps エンジニア
タスク説明必要なスキル

Lambda 関数をデプロイします。

ピア接続された VPC に Lambda 関数をデプロイするには、次の手順を実行します。

  1. Lambda コンソール (https://console.aws.amazon.com/lambda/) を開きます。

  2. 関数を選択します。

  3. [Create function (関数の作成)] を選択します。

  4. [基本的な情報] の [関数名] に、関数の名前を入力します。

  5. Runtime で、Python 3.8 を選択します

  6. デフォルトの実行ロールの変更を展開し、次の操作を行います。

    1. [既存のロールを使用する] を選択します。

    2. 既存のロールで、前に作成した CrossAccount-RM-Read-Role Lambda ロールを選択します。

  7. 詳細設定を展開し、次の操作を行います。

    1. VPC を有効にするチェックボックスをオンにします。

    2. VPC の場合は、DEV アカウントのピア接続された VPC を選択します。

    3. サブネット で、プライベートサブネットを選択します。

    4. [Security groups (セキュリティグループ)] で、デフォルトのセキュリティグループを選択します。

  8. [Create function (関数の作成)] を選択します。

  9. psycopg2 ライブラリを Lambda 関数にレイヤーとして追加します。

    注記

    psycopg2-lambda-layer リポジトリからデプロイ済みのレイヤーを使用できます。 AWS リージョン と Python ランタイムに基づいて URL を使用してください。

DevOps エンジニア

Lambda 関数をデプロイします

タスク説明必要なスキル

Lambda 関数をデプロイします。

ピア接続された VPC に Lambda 関数をデプロイするには、次の手順を実行します。

  1. Lambda コンソール (https://console.aws.amazon.com/lambda/) を開きます。

  2. 関数を選択します。

  3. [Create function (関数の作成)] を選択します。

  4. [基本的な情報] の [関数名] に、関数の名前を入力します。

  5. Runtime で、Python 3.8 を選択します

  6. デフォルトの実行ロールの変更を展開し、次の操作を行います。

    1. [既存のロールを使用する] を選択します。

    2. 既存のロールで、前に作成した CrossAccount-RM-Read-Role Lambda ロールを選択します。

  7. 詳細設定を展開し、次の操作を行います。

    1. VPC を有効にするチェックボックスをオンにします。

    2. VPC の場合は、DEV アカウントのピア接続された VPC を選択します。

    3. サブネット で、プライベートサブネットを選択します。

    4. [Security groups (セキュリティグループ)] で、デフォルトのセキュリティグループを選択します。

  8. [Create function (関数の作成)] を選択します。

  9. psycopg2 ライブラリを Lambda 関数にレイヤーとして追加します。

    注記

    psycopg2-lambda-layer リポジトリからデプロイ済みのレイヤーを使用できます。 AWS リージョン と Python ランタイムに基づいて URL を使用してください。

DevOps エンジニア
タスク説明必要なスキル

必要なリソースをインポートします。

必要なリソースをインポートするには、次のコマンドを実行します。

import ast import boto3 import psycopg2 import base64 from botocore.exceptions import ClientError
アプリ開発者

Lambda ハンドラー関数を実行します。

Lambda 関数は、クロスアカウントアクセスと一時的な認証情報管理に AWS Security Token Service (AWS STS) を使用します。関数はAssumeRole API オペレーションを使用して、IAM sm_read_role ロールのアクセス許可を一時的に引き受けます。

Lambda 関数を実行するには、次のサンプルコードを使用します。

def lambda_handler(event, context): sts_client = boto3.client('sts') # Secrets Manager Configurations secret_name = "redshift_creds" sm_region = "eu-west-1" sm_read_role = "arn:aws:iam::PROD_ACCOUNT_NUMBER:role/SM-Read-Role" # S3 Bucket Configurations s3_bucket_path = "s3://mybucket/" s3_bucket_region = "eu-west-1" s3_write_role = "arn:aws:iam::DEV_ACCOUNT_NUMBER:role/S3-Write-Role" # Redshift Configurations sql_query = "select * from category" redshift_db = "dev" redshift_s3_write_role = "arn:aws:iam::PROD_ACCOUNT_NUMBER:role/CrossAccount-S3-Write-Role" chained_s3_write_role = "%s,%s" % (redshift_s3_write_role, s3_write_role) assumed_role_object = sts_client.assume_role( RoleArn=sm_read_role, RoleSessionName="CrossAccountRoleAssumption", ExternalId="YOUR_EXTERNAL_ID", ) credentials = assumed_role_object['Credentials'] secret_dict = ast.literal_eval(get_secret(credentials, secret_name, sm_region)) execute_query(secret_dict, sql_query, s3_bucket_path, chained_s3_write_role, s3_bucket_region, redshift_db) return { 'statusCode': 200 }
アプリ開発者

シークレットを取得します。

Amazon Redshift シークレットを取得するには、次のサンプルコードを使用します。

def get_secret(credentials, secret_name, sm_region): # Create a Secrets Manager client session = boto3.session.Session() sm_client = session.client( service_name='secretsmanager', aws_access_key_id=credentials['AccessKeyId'], aws_secret_access_key=credentials['SecretAccessKey'], aws_session_token=credentials['SessionToken'], region_name=sm_region ) try: get_secret_value_response = sm_client.get_secret_value( SecretId=secret_name ) except ClientError as e: print(e) raise e else: if 'SecretString' in get_secret_value_response: return get_secret_value_response['SecretString'] else: return base64.b64decode(get_secret_value_response['SecretBinary'])
アプリ開発者

アンロードコマンドを実行します。

S3 バケットにデータをアンロードするには、次のサンプルコードを使用します。

def execute_query(secret_dict, sql_query, s3_bucket_path, chained_s3_write_role, s3_bucket_region, redshift_db): conn_string = "dbname='%s' port='%s' user='%s' password='%s' host='%s'" \ % (redshift_db, secret_dict["port"], secret_dict["username"], secret_dict["password"], secret_dict["host"]) con = psycopg2.connect(conn_string) unload_command = "UNLOAD ('{}') TO '{}' IAM_ROLE '{}' DELIMITER '|' REGION '{}';" \ .format(sql_query, s3_bucket_path + str(datetime.datetime.now()) + ".csv", chained_s3_write_role, s3_bucket_region) # Opening a cursor and run query cur = con.cursor() cur.execute(unload_command) print(cur.fetchone()) cur.close() con.close()
アプリ開発者

アーキテクチャをテストする

タスク説明必要なスキル

必要なリソースをインポートします。

必要なリソースをインポートするには、次のコマンドを実行します。

import ast import boto3 import psycopg2 import base64 from botocore.exceptions import ClientError
アプリ開発者

Lambda ハンドラー関数を実行します。

Lambda 関数は、クロスアカウントアクセスと一時的な認証情報管理に AWS Security Token Service (AWS STS) を使用します。関数はAssumeRole API オペレーションを使用して、IAM sm_read_role ロールのアクセス許可を一時的に引き受けます。

Lambda 関数を実行するには、次のサンプルコードを使用します。

def lambda_handler(event, context): sts_client = boto3.client('sts') # Secrets Manager Configurations secret_name = "redshift_creds" sm_region = "eu-west-1" sm_read_role = "arn:aws:iam::PROD_ACCOUNT_NUMBER:role/SM-Read-Role" # S3 Bucket Configurations s3_bucket_path = "s3://mybucket/" s3_bucket_region = "eu-west-1" s3_write_role = "arn:aws:iam::DEV_ACCOUNT_NUMBER:role/S3-Write-Role" # Redshift Configurations sql_query = "select * from category" redshift_db = "dev" redshift_s3_write_role = "arn:aws:iam::PROD_ACCOUNT_NUMBER:role/CrossAccount-S3-Write-Role" chained_s3_write_role = "%s,%s" % (redshift_s3_write_role, s3_write_role) assumed_role_object = sts_client.assume_role( RoleArn=sm_read_role, RoleSessionName="CrossAccountRoleAssumption", ExternalId="YOUR_EXTERNAL_ID", ) credentials = assumed_role_object['Credentials'] secret_dict = ast.literal_eval(get_secret(credentials, secret_name, sm_region)) execute_query(secret_dict, sql_query, s3_bucket_path, chained_s3_write_role, s3_bucket_region, redshift_db) return { 'statusCode': 200 }
アプリ開発者

シークレットを取得します。

Amazon Redshift シークレットを取得するには、次のサンプルコードを使用します。

def get_secret(credentials, secret_name, sm_region): # Create a Secrets Manager client session = boto3.session.Session() sm_client = session.client( service_name='secretsmanager', aws_access_key_id=credentials['AccessKeyId'], aws_secret_access_key=credentials['SecretAccessKey'], aws_session_token=credentials['SessionToken'], region_name=sm_region ) try: get_secret_value_response = sm_client.get_secret_value( SecretId=secret_name ) except ClientError as e: print(e) raise e else: if 'SecretString' in get_secret_value_response: return get_secret_value_response['SecretString'] else: return base64.b64decode(get_secret_value_response['SecretBinary'])
アプリ開発者

アンロードコマンドを実行します。

S3 バケットにデータをアンロードするには、次のサンプルコードを使用します。

def execute_query(secret_dict, sql_query, s3_bucket_path, chained_s3_write_role, s3_bucket_region, redshift_db): conn_string = "dbname='%s' port='%s' user='%s' password='%s' host='%s'" \ % (redshift_db, secret_dict["port"], secret_dict["username"], secret_dict["password"], secret_dict["host"]) con = psycopg2.connect(conn_string) unload_command = "UNLOAD ('{}') TO '{}' IAM_ROLE '{}' DELIMITER '|' REGION '{}';" \ .format(sql_query, s3_bucket_path + str(datetime.datetime.now()) + ".csv", chained_s3_write_role, s3_bucket_region) # Opening a cursor and run query cur = con.cursor() cur.execute(unload_command) print(cur.fetchone()) cur.close() con.close()
アプリ開発者
タスク説明必要なスキル

Lambda 関数を削除する

予期しないコストが発生しないようにするには、リソースと DEV アカウントと PROD アカウント間の接続を削除します。

Lambda 関数を削除するには、次の手順を実行します。

  1. https://console.aws.amazon.com/lambda/. で AWS Lambda コンソールを開きます。

  2. 作成した Lambda 関数を見つけて選択します。

  3. [アクション] を選択し、[削除] を選択します。

  4. 削除を確定します。

DevOps エンジニア

IAM ロールとポリシーを削除します。

DEV アカウントと PROD アカウントから IAM ロールとポリシーを削除します。

DEV アカウントで、次の操作を行います。

  1. [IAM コンソール] を開きます。

  2. 次のロールを削除します。

    • S3-Write-Role

    • CrossAccount-RM-Read-Role (Lambda ロール)

  3. 関連付けられたポリシーを削除します。

    • S3-Write-Policy

    • PROD アカウントロールを引き受けるための CrossAccount ポリシー

PROD アカウントで、次の操作を行います。

  1. [IAM コンソール] を開きます。

  2. 次のロールを削除します。

    • SM-Read-Role

    • CrossAccount-S3-Write-Role

  3. 関連付けられたポリシーを削除します。

    • Secrets Manager にアクセスするための CrossAccount ポリシー

    • S3-Write-Role-Assume-Policy

DevOps エンジニア

Secrets Manager でシークレットを削除します。

シークレットを削除するには、次の手順を実行します。

  1. PROD アカウントで、Secrets Manager コンソールを開きます。

  2. という名前のシークレットを見つけて選択しますRedshift-Creds-Secret

  3. [Actions] (アクション) を選択してから、[Delete secret] (シークレットの削除) を選択します。

  4. 削除を確定します。

DevOps エンジニア

VPC ピアリングとセキュリティグループのルールを削除します。

VPC ピアリングとセキュリティグループのルールを削除するには、次の手順を実行します。

  1. PROD アカウントで、https://console.aws.amazon.com/ec2/. で Amazon EC2 コンソールを開きます。

  2. セキュリティグループに移動します。

  3. Amazon Redshift クラスターで使用されるセキュリティグループを見つけます。

  4. インバウンドルールを編集し、DEV アカウントの Lambda VPC からの接続を許可するルールを削除します。

  5. VPC ピアリング接続に移動し、ピアリング接続を削除します。

DevOps エンジニア

S3 バケットからデータを削除します。

Amazon S3 からデータを削除するには、次の手順を実行します。

  1. DEV アカウントで、https://console.aws.amazon.com/s3/. で Amazon S3 コンソールを開きます。

  2. データストレージに使用したバケットを見つけます。

  3. バケット内のオブジェクトを削除するか、不要になった場合はバケット全体を削除します。

DevOps エンジニア

AWS KMS キーをクリーンアップします。

暗号化用のカスタム AWS KMS キーを作成した場合は、次の操作を行います。

  1. https://console.aws.amazon.com/kms/. で AWS KMS コンソールを開きます。

  2. このパターン用に作成されたキーを見つけます。

  3. キーの削除をスケジュールします。(キーの削除には必須の待機期間があります)。

DevOps エンジニア

Amazon CloudWatch logs。

CloudWatch ログを削除するには、次の手順を実行します。

  1. CloudWatch コンソール (https://console.aws.amazon.com/cloudwatch/) を開きます。

  2. Lambda 関数または Amazon Redshift クラスターによって作成されたロググループがないか確認します。

  3. これらのロググループが不要になった場合は削除します。

DevOps エンジニア

クリーンアップ

タスク説明必要なスキル

Lambda 関数を削除する

予期しないコストが発生しないようにするには、リソースと DEV アカウントと PROD アカウント間の接続を削除します。

Lambda 関数を削除するには、次の手順を実行します。

  1. https://console.aws.amazon.com/lambda/. で AWS Lambda コンソールを開きます。

  2. 作成した Lambda 関数を見つけて選択します。

  3. [アクション] を選択し、[削除] を選択します。

  4. 削除を確定します。

DevOps エンジニア

IAM ロールとポリシーを削除します。

DEV アカウントと PROD アカウントから IAM ロールとポリシーを削除します。

DEV アカウントで、次の操作を行います。

  1. [IAM コンソール] を開きます。

  2. 次のロールを削除します。

    • S3-Write-Role

    • CrossAccount-RM-Read-Role (Lambda ロール)

  3. 関連付けられたポリシーを削除します。

    • S3-Write-Policy

    • PROD アカウントロールを引き受けるための CrossAccount ポリシー

PROD アカウントで、次の操作を行います。

  1. [IAM コンソール] を開きます。

  2. 次のロールを削除します。

    • SM-Read-Role

    • CrossAccount-S3-Write-Role

  3. 関連付けられたポリシーを削除します。

    • Secrets Manager にアクセスするための CrossAccount ポリシー

    • S3-Write-Role-Assume-Policy

DevOps エンジニア

Secrets Manager でシークレットを削除します。

シークレットを削除するには、次の手順を実行します。

  1. PROD アカウントで、Secrets Manager コンソールを開きます。

  2. という名前のシークレットを見つけて選択しますRedshift-Creds-Secret

  3. [Actions] (アクション) を選択してから、[Delete secret] (シークレットの削除) を選択します。

  4. 削除を確定します。

DevOps エンジニア

VPC ピアリングとセキュリティグループのルールを削除します。

VPC ピアリングとセキュリティグループのルールを削除するには、次の手順を実行します。

  1. PROD アカウントで、https://console.aws.amazon.com/ec2/. で Amazon EC2 コンソールを開きます。

  2. セキュリティグループに移動します。

  3. Amazon Redshift クラスターで使用されるセキュリティグループを見つけます。

  4. インバウンドルールを編集し、DEV アカウントの Lambda VPC からの接続を許可するルールを削除します。

  5. VPC ピアリング接続に移動し、ピアリング接続を削除します。

DevOps エンジニア

S3 バケットからデータを削除します。

Amazon S3 からデータを削除するには、次の手順を実行します。

  1. DEV アカウントで、https://console.aws.amazon.com/s3/. で Amazon S3 コンソールを開きます。

  2. データストレージに使用したバケットを見つけます。

  3. バケット内のオブジェクトを削除するか、不要になった場合はバケット全体を削除します。

DevOps エンジニア

AWS KMS キーをクリーンアップします。

暗号化用のカスタム AWS KMS キーを作成した場合は、次の操作を行います。

  1. https://console.aws.amazon.com/kms/. で AWS KMS コンソールを開きます。

  2. このパターン用に作成されたキーを見つけます。

  3. キーの削除をスケジュールします。(キーの削除には必須の待機期間があります)。

DevOps エンジニア

Amazon CloudWatch logs。

CloudWatch ログを削除するには、次の手順を実行します。

  1. CloudWatch コンソール (https://console.aws.amazon.com/cloudwatch/) を開きます。

  2. Lambda 関数または Amazon Redshift クラスターによって作成されたロググループがないか確認します。

  3. これらのロググループが不要になった場合は削除します。

DevOps エンジニア

関連リソース

追加情報

Amazon Redshift から Amazon S3 にデータをアンロードした後、Amazon Athena を使用してデータを分析できます。

Amazon Athena は、大量のデータにアクセスする必要がある場合に便利なビッグデータクエリサービスです。サーバーやデータベースをプロビジョニングしなくても Athena を使用できます。Athena は複雑なクエリをサポートしており、さまざまなオブジェクトで実行できます。

ほとんどの と同様に AWS のサービス、Athena を使用する主な利点は、複雑さを増すことなくクエリの実行方法に大きな柔軟性があることです。Athena を使用すると、データ型を変更せずに、Amazon S3 で CSV や JSON などのさまざまなデータ型をクエリできます。外部を含むさまざまなソースからデータをクエリできます AWS。Athena は、サーバーを管理する必要がないため、複雑さを軽減します。Athena は、クエリを実行する前にデータをロードまたは変更することなく、Amazon S3 から直接データを読み取ります。

プライバシーサイト規約Cookie の設定
© 2025, Amazon Web Services, Inc. or its affiliates.All rights reserved.