Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Atur akses lintas akun untuk Amazon EMR di EKS
Anda dapat mengatur akses lintas-akun untuk Amazon EMR di EKS. Akses lintas akun memungkinkan pengguna dari satu akun AWS untuk menjalankan tugas Amazon EMR di EKS dan mengakses data yang mendasari milik akun AWS lain.
Prasyarat
Untuk menyiapkan akses lintas-akun untuk Amazon EMR di EKS, Anda akan menyelesaikan tugas saat masuk ke akun AWS:
AccountA
- Sebuah akun AWS di mana Anda telah membuat klaster virtual Amazon EMR di EKS dengan mendaftarkan Amazon EMR dengan namespace pada klaster EKS.AccountB
- Sebuah akun AWS yang berisi bucket Amazon S3 atau tabel DynamoDB yang Anda inginkan untuk diakses tugas Amazon EMR di EKS.
Anda harus menyiapkan hal berikut dalam akun AWS Anda mengatur akses lintas akun:
Klaster virtual Amazon EMR di EKS di
AccountA
di mana Anda ingin menjalankan tugas.Peran eksekusi tugas di
AccountA
yang memiliki izin yang diperlukan untuk menjalankan tugas di klaster virtual. Untuk informasi lebih lanjut, lihat Untuk membuat peran eksekusi tugas dan Menggunakan peran eksekusi tugas dengan Amazon EMR di EKS.
Cara mengakses bucket Amazon S3 lintas akun atau tabel DynamoDB
Untuk mengatur akses lintas-akun untuk Amazon EMR di EKS, selesaikan langkah-langkah berikut.
Buat bucket Amazon S3,
cross-account-bucket
, diAccountB
. Untuk informasi lebih lanjut, lihat Membuat bucket. Jika Anda ingin memiliki akses lintas-akun ke DynamoDB, Anda juga dapat membuat tabel DynamoDB diAccountB
. Untuk informasi selengkapnya, lihat Membuat tabel DynamoDB.Buat IAM role
Cross-Account-Role-B
dalamAccountB
yang dapat mengaksescross-account-bucket
.Masuklah ke konsol IAM.
Pilih Peran dan buat peran baru:
Cross-Account-Role-B
. Untuk informasi selengkapnya tentang cara membuat IAM role, lihat Membuat IAM role dalam Panduan Pengguna IAM.Buat kebijakan IAM yang menentukan izin untuk
Cross-Account-Role-B
untuk mengakses S3 bucketcross-account-bucket
, seperti yang ditunjukkan pernyataan kebijakan berikut. Kemudian lampirkan kebijakan IAM keCross-Account-Role-B
. Untuk informasi selengkapnya, lihat Membuat Kebijakan Baru dalam Panduan Pengguna IAM.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::cross-account-bucket", "arn:aws:s3:::cross-account-bucket/*" ] } ] }
Jika akses DynamoDB diperlukan, buat kebijakan IAM yang menentukan izin untuk mengakses tabel DynamoDB lintas akun. Kemudian lampirkan kebijakan IAM ke
Cross-Account-Role-B
. Untuk informasi selengkapnya, lihat Buat tabel DynamoDB dalam Panduan Pengguna IAM.Berikut ini adalah kebijakan untuk mengakses tabel DynamoDB,
CrossAccountTable
.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "dynamodb:*", "Resource": "arn:aws:dynamodb:
MyRegion:AccountB
:table/CrossAccountTable" } ] }
Cara mengedit hubungan kepercayaan untuk peran
Cross-Account-Role-B
.Untuk mengonfigurasi hubungan kepercayaan untuk peran, pilih tab Hubungan Kepercayaan di konsol IAM untuk peran yang dibuat di langkah 2:
Cross-Account-Role-B
.Pilih Edit Hubungan Kepercayaan.
Tambahkan dokumen kebijakan berikut, yang memungkinkan
Job-Execution-Role-A
dalamAccountA
untuk mengasumsikan peranCross-Account-Role-B
ini.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
AccountA
:role/Job-Execution-Role-A" }, "Action": "sts:AssumeRole" } ] }
Berikan
Job-Execution-Role-A
AccountA
dengan - STS Asumsikan izin peran untuk mengasumsikanCross-Account-Role-B
.Dalam konsol IAM untuk akun AWS
AccountA
, pilihJob-Execution-Role-A
.Tambahkan pernyataan kebijakan berikut pada
Job-Execution-Role-A
untuk mengizinkan tindakanAssumeRole
di peranCross-Account-Role-B
.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::
AccountB
:role/Cross-Account-Role-B" } ] }
Untuk akses Amazon S3, atur parameter
spark-submit
berikut (spark conf
) saat mengirimkan tugas ke Amazon EMR di EKS.catatan
Secara default, EMRFS menggunakan peran eksekusi tugas untuk mengakses bucket S3 dari tugas. Tapi saat
customAWSCredentialsProvider
diatur keAssumeRoleAWSCredentialsProvider
, EMRFS menggunakan peran yang sesuai yang Anda tentukan denganASSUME_ROLE_CREDENTIALS_ROLE_ARN
bukan dariJob-Execution-Role-A
untuk akses Amazon S3.--conf spark.hadoop.fs.s3.customAWSCredentialsProvider=com.amazonaws.emr.AssumeRoleAWSCredentialsProvider
--conf spark.kubernetes.driverEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN=arn:aws:iam::
AccountB
:role/Cross-Account-Role-B \--conf spark.executorEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN=arn:aws:iam::
AccountB
:role/Cross-Account-Role-B \
catatan
Anda harus menetapkan
ASSUME_ROLE_CREDENTIALS_ROLE_ARN
baik untuk pelaksana maupun driverenv
dalam konfigurasi tugas spark.Untuk akses lintas akun DynamoDB, Anda harus mengatur
--conf spark.dynamodb.customAWSCredentialsProvider=com.amazonaws.emr.AssumeRoleAWSCredentialsProvider
.Jalankan Amazon EMR pada tugas EKS dengan akses lintas-akun, seperti yang ditunjukkan contoh berikut.
aws emr-containers start-job-run \ --virtual-cluster-id 123456 \ --name myjob \ --execution-role-arn execution-role-arn \ --release-label emr-6.2.0-latest \ --job-driver '{"sparkSubmitJobDriver": {"entryPoint": "entryPoint_location", "entryPointArguments": ["arguments_list"], "sparkSubmitParameters": "--class <main_class> --conf spark.executor.instances=2 --conf spark.executor.memory=2G --conf spark.executor.cores=2 --conf spark.driver.cores=1 --conf spark.hadoop.fs.s3.customAWSCredentialsProvider=com.amazonaws.emr.AssumeRoleAWSCredentialsProvider --conf spark.kubernetes.driverEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN=arn:aws:iam::
AccountB
:role/Cross-Account-Role-B --conf spark.executorEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN=arn:aws:iam::AccountB
:role/Cross-Account-Role-B"}} ' \ --configuration-overrides '{"applicationConfiguration": [{"classification": "spark-defaults", "properties": {"spark.driver.memory": "2G"}}], "monitoringConfiguration": {"cloudWatchMonitoringConfiguration": {"logGroupName": "log_group_name", "logStreamNamePrefix": "log_stream_prefix"}, "persistentAppUI":"ENABLED", "s3MonitoringConfiguration": {"logUri": "s3://my_s3_log_location" }}}'