Apache Spark 用の Amazon Redshift インテグレーションを使用した認証 - Amazon EMR

Apache Spark 用の Amazon Redshift インテグレーションを使用した認証

AWS Secrets Manager を使用した認証情報の取得と Amazon Redshift への接続

次のコードサンプルは、AWS Secrets Manager を使用して認証情報を取得し、Python の Apache Spark 用の PySpark インターフェイスで Amazon Redshift クラスターに接続する方法を示しています。

from pyspark.sql import SQLContext import boto3 sc = # existing SparkContext sql_context = SQLContext(sc) secretsmanager_client = boto3.client('secretsmanager') secret_manager_response = secretsmanager_client.get_secret_value( SecretId='string', VersionId='string', VersionStage='string' ) username = # get username from secret_manager_response password = # get password from secret_manager_response url = "jdbc:redshift://redshifthost:5439/database?user=" + username + "&password=" + password # Read data from a table df = sql_context.read \ .format("io.github.spark_redshift_community.spark.redshift") \ .option("url", url) \ .option("dbtable", "my_table") \ .option("tempdir", "s3://path/for/temp/data") \ .load()

IAM を使用して認証情報を取得し、Amazon Redshift に接続する

Amazon Redshift が提供する JDBC バージョン 2 ドライバーを使用し、Spark コネクタで Amazon Redshift に接続できます。AWS Identity and Access Management (IAM) を使用するには、IAM 認証を使用するように JDBC URL を設定します。Amazon EMR から Redshift クラスターに接続するには、IAM ロールに一時的な IAM 認証情報を取得する権限を付与する必要があります。次の権限を IAM ロールに割り当てて、認証情報を取得して Amazon S3 オペレーションを実行できるようにします。

GetClusterCredentials の詳細については、「GetClusterCredentials のリソースポリシー」を参照してください。

また、COPY および UNLOAD オペレーション中に Amazon Redshift が IAM ロールを引き継げるようにする必要があります。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Resource": "arn:aws:iam::123456789012:role/RedshiftServiceRole", "Sid": "AllowSTSAssumerole" } ] }

以下の例では、Spark と Amazon Redshift の間で IAM 認証を使用しています。

from pyspark.sql import SQLContext import boto3 sc = # existing SparkContext sql_context = SQLContext(sc) url = "jdbc:redshift:iam://redshift-host:redshift-port/db-name" iam_role_arn = "arn:aws:iam::account-id:role/role-name" # Read data from a table df = sql_context.read \ .format("io.github.spark_redshift_community.spark.redshift") \ .option("url", url) \ .option("aws_iam_role", iam_role_arn) \ .option("dbtable", "my_table") \ .option("tempdir", "s3a://path/for/temp/data") \ .mode("error") \ .load()