Atur akses lintas akun untuk Amazon EMR di EKS - Amazon EMR

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:

Cara mengakses bucket Amazon S3 lintas akun atau tabel DynamoDB

Untuk mengatur akses lintas-akun untuk Amazon EMR di EKS, selesaikan langkah-langkah berikut.

  1. Buat bucket Amazon S3, cross-account-bucket, di AccountB. Untuk informasi lebih lanjut, lihat Membuat bucket. Jika Anda ingin memiliki akses lintas-akun ke DynamoDB, Anda juga dapat membuat tabel DynamoDB di AccountB. Untuk informasi selengkapnya, lihat Membuat tabel DynamoDB.

  2. Buat IAM role Cross-Account-Role-B dalam AccountB yang dapat mengakses cross-account-bucket.

    1. Masuklah ke konsol IAM.

    2. 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.

    3. Buat kebijakan IAM yang menentukan izin untuk Cross-Account-Role-B untuk mengakses S3 bucket cross-account-bucket, seperti yang ditunjukkan pernyataan kebijakan berikut. Kemudian lampirkan kebijakan IAM ke Cross-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" } ] }
  3. Cara mengedit hubungan kepercayaan untuk peran Cross-Account-Role-B.

    1. Untuk mengonfigurasi hubungan kepercayaan untuk peran, pilih tab Hubungan Kepercayaan di konsol IAM untuk peran yang dibuat di langkah 2: Cross-Account-Role-B.

    2. Pilih Edit Hubungan Kepercayaan.

    3. Tambahkan dokumen kebijakan berikut, yang memungkinkan Job-Execution-Role-A dalam AccountA untuk mengasumsikan peran Cross-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" } ] }
  4. Berikan Job-Execution-Role-A AccountA dengan - STS Asumsikan izin peran untuk mengasumsikanCross-Account-Role-B.

    1. Dalam konsol IAM untuk akun AWS AccountA, pilih Job-Execution-Role-A.

    2. Tambahkan pernyataan kebijakan berikut pada Job-Execution-Role-A untuk mengizinkan tindakan AssumeRole di peran Cross-Account-Role-B.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::AccountB:role/Cross-Account-Role-B" } ] }
  5. 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 ke AssumeRoleAWSCredentialsProvider, EMRFS menggunakan peran yang sesuai yang Anda tentukan dengan ASSUME_ROLE_CREDENTIALS_ROLE_ARN bukan dari Job-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 driver env dalam konfigurasi tugas spark.

    Untuk akses lintas akun DynamoDB, Anda harus mengatur --conf spark.dynamodb.customAWSCredentialsProvider=com.amazonaws.emr.AssumeRoleAWSCredentialsProvider.

  6. 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" }}}'