

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

# Apache Spark 用の Amazon Redshift インテグレーションを使用した認証
<a name="emr-spark-redshift-auth"></a>

## AWS Secrets Manager を使用して認証情報を取得し、Amazon Redshift に接続する
<a name="emr-spark-redshift-secrets"></a>

次のコードサンプルは、 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 に接続する
<a name="emr-spark-redshift-iam"></a>

Amazon Redshift が提供する JDBC バージョン 2 ドライバーを使用し、Spark コネクタで Amazon Redshift に接続できます。 AWS Identity and Access Management (IAM) を使用するには、[IAM 認証を使用するように JDBC URL を設定します](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-iam-credentials-configure-jdbc-odbc.html)。Amazon EMR から Redshift クラスターに接続するには、IAM ロールに一時的な IAM 認証情報を取得する権限を付与する必要があります。次の権限を IAM ロールに割り当てて、認証情報を取得して Amazon S3 オペレーションを実行できるようにします。
+  [Redshift:GetClusterCredentials](https://docs.aws.amazon.com/redshift/latest/APIReference/API_GetClusterCredentials.html) (プロビジョニングされた Amazon Redshift クラスターの場合) 
+  [Redshift:DescribeClusters](https://docs.aws.amazon.com/redshift/latest/APIReference/API_DescribeClusters.html) (プロビジョニングされた Amazon Redshift クラスターの場合) 
+ [Redshift:GetWorkgroup](https://docs.aws.amazon.com/redshift-serverless/latest/APIReference/API_GetWorkgroup.html) (Amazon Redshift Serverless ワークグループの場合)
+  [Redshift:GetCredentials](https://docs.aws.amazon.com/redshift-serverless/latest/APIReference/API_GetCredentials.html) (Amazon Redshift Serverless の場合、ワークグループ) 
+  [s3:GetBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucket.html) 
+  [s3:GetBucketLocation](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLocation.html) 
+  [s3:GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) 
+  [s3:PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) 
+  [s3:GetBucketLifecycleConfiguration](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html) 

`GetClusterCredentials` の詳細については、「[`GetClusterCredentials` のリソースポリシー](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html#redshift-policy-resources.getclustercredentials-resources)」を参照してください。

また、`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()
```