클러스터 EC2 인스턴스에 대한 서비스 역할(EC2 인스턴스 프로파일) - Amazon EMR

클러스터 EC2 인스턴스에 대한 서비스 역할(EC2 인스턴스 프로파일)

클러스터 EC2 인스턴스의 서비스 역할(Amazon EMR에 대한 EC2 인스턴스 프로파일이라고도 함)은 인스턴스를 시작할 때 Amazon EMR 클러스터의 모든 EC2 인스턴스에 할당되는 특별한 유형의 서비스 역할입니다. Hadoop 에코시스템의 상단에서 실행되는 애플리케이션 프로세스는 다른 AWS 제품과 상호 작용하기 위한 권한에 대해 이 역할을 수임합니다.

EC2 인스턴스의 서비스 역할에 대한 자세한 내용은 IAM 사용 설명서에서 IAM 역할을 사용하여 Amazon EC2 인스턴스에서 실행되는 애플리케이션에 권한 부여를 참조하세요.

중요

클러스터 EC2 인스턴스의 기본 서비스 역할 및 연결된 AWS 기본 관리형 정책(AmazonElasticMapReduceforEC2Role)은 지원 중단될 예정이며, 대체 AWS 관리형 정책은 제공되지 않습니다. 더 이상 사용되지 않는 역할과 기본 정책을 대체할 인스턴스 프로파일을 생성하고 지정해야 합니다.

기본 역할 및 관리형 정책

  • 기본 역할 이름은 EMR_EC2_DefaultRole입니다.

  • EMR_EC2_DefaultRole 기본 관리형 정책(AmazonElasticMapReduceforEC2Role)은 곧 지원이 종료될 예정입니다. EC2 인스턴스 프로파일의 기본 관리형 정책을 사용하는 대신, Amazon EMR에 필요한 S3 버킷 및 기타 리소스에 리소스 기반 정책을 적용하거나 IAM 역할을 인스턴스 프로파일로 사용하는 고객 관리형 정책을 사용합니다. 자세한 내용은 최소 권한으로 클러스터 EC2 인스턴스에 대한 서비스 역할 생성 단원을 참조하십시오.

다음은 AmazonElasticMapReduceforEC2Role의 버전 3 콘텐츠를 보여줍니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Resource": "*", "Action": [ "cloudwatch:*", "dynamodb:*", "ec2:Describe*", "elasticmapreduce:Describe*", "elasticmapreduce:ListBootstrapActions", "elasticmapreduce:ListClusters", "elasticmapreduce:ListInstanceGroups", "elasticmapreduce:ListInstances", "elasticmapreduce:ListSteps", "kinesis:CreateStream", "kinesis:DeleteStream", "kinesis:DescribeStream", "kinesis:GetRecords", "kinesis:GetShardIterator", "kinesis:MergeShards", "kinesis:PutRecord", "kinesis:SplitShard", "rds:Describe*", "s3:*", "sdb:*", "sns:*", "sqs:*", "glue:CreateDatabase", "glue:UpdateDatabase", "glue:DeleteDatabase", "glue:GetDatabase", "glue:GetDatabases", "glue:CreateTable", "glue:UpdateTable", "glue:DeleteTable", "glue:GetTable", "glue:GetTables", "glue:GetTableVersions", "glue:CreatePartition", "glue:BatchCreatePartition", "glue:UpdatePartition", "glue:DeletePartition", "glue:BatchDeletePartition", "glue:GetPartition", "glue:GetPartitions", "glue:BatchGetPartition", "glue:CreateUserDefinedFunction", "glue:UpdateUserDefinedFunction", "glue:DeleteUserDefinedFunction", "glue:GetUserDefinedFunction", "glue:GetUserDefinedFunctions" ] } ] }

서비스 역할은 다음 신뢰 정책을 사용해야 합니다.

{ "Version": "2008-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

최소 권한으로 클러스터 EC2 인스턴스에 대한 서비스 역할 생성

애플리케이션에 필요한 다른 AWS 서비스 제품에 대한 최소 권한을 보유한 권한 정책 및 클러스터 EC2 인스턴스의 서비스 역할을 생성하는 것이 모범 사례입니다.

기본 관리형 정책인 AmazonElasticMapReduceforEC2Role은 초기 클러스터를 쉽게 시작할 수 있는 권한을 제공합니다. 하지만 AmazonElasticMapReduceforEC2Role은 지원 중단될 예정이며 Amazon EMR은 더 이상 사용되지 않는 역할에 대한 대체 AWS 관리형 기본 정책을 제공하지 않습니다. 초기 클러스터를 시작하려면 고객 관리형 리소스 기반 또는 ID 기반 정책을 제공해야 합니다.

아래 정책 명령문은 Amazon EMR의 여러 기능에 필요한 권한의 예제를 제공합니다. 이러한 권한을 사용하여 클러스터에 필요한 기능과 리소스에 대한 액세스만 제한하는 권한 정책을 생성하는 것이 좋습니다. 모든 예제 정책 명령문에서는 us-west-2 리전 및 가상 AWS 계정 ID 123456789012를 사용합니다. 이를 클러스터에 해당하는 사항으로 바꾸세요.

사용자 지정 역할 생성 및 지정에 대한 자세한 내용은 Amazon EMR을 사용하여 IAM 역할 사용자 지정 단원을 참조하세요.

참고

EC2에 대한 사용자 지정 EMR 역할을 생성하는 경우 동일한 이름의 인스턴스 프로파일이 자동으로 생성되는 기본 워크플로를 따릅니다. Amazon EC2에서는 서로 다른 이름으로 인스턴스 프로파일과 역할을 생성할 수 있지만 Amazon EMR에서는 이 구성을 지원하지 않으므로 클러스터를 생성할 때 '잘못된 인스턴스 프로파일' 오류가 발생합니다.

EMRFS를 사용하여 Amazon S3에서 데이터 읽기 및 쓰기

Amazon EMR 클러스터에서 실행되는 애플리케이션이 s3://mydata 형식을 사용하여 데이터를 참조할 경우 Amazon EMR에서는 EC2 인스턴스 프로파일을 사용하여 요청합니다. 클러스터는 일반적으로 이 방식으로 Amazon S3에서 데이터를 읽고 쓰며, Amazon EMR은 기본적으로 클러스터 EC2 인스턴스의 서비스 역할에 연결된 권한을 사용합니다. 자세한 내용은 Amazon S3에 대한 EMRFS 요청의 IAM 역할 구성 단원을 참조하십시오.

EMRFS의 IAM 역할은 클러스터 EC2 인스턴스의 서비스 역할에 연결된 권한으로 돌아가므로 EMRFS의 IAM 역할을 사용하고 클러스터 EC2 인스턴스의 서비스 역할에 연결된 EMRFS 및 Amazon S3 권한으로 제한하는 것이 모범 사례입니다.

아래의 샘플 명령문은 Amazon S3에 대한 요청을 수행하기 위해 EMRFS에 필요한 권한을 보여줍니다.

  • my-data-bucket-in-s3-for-emrfs-reads-and-writes에서는 클러스터가 /*를 사용하여 데이터와 모든 하위 폴더를 읽고 쓰는 Amazon S3의 버킷을 지정합니다. 이러한 버킷과 애플리케이션에 필요한 폴더만 추가하세요.

  • EMRFS 일관된 보기가 활성화된 경우에만 dynamodb 작업을 허용하는 정책 명령문이 필요합니다. EmrFSMetadata에서는 EMRFS 일관된 보기의 기본 폴더를 지정합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:CreateBucket", "s3:DeleteObject", "s3:GetBucketVersioning", "s3:GetObject", "s3:GetObjectTagging", "s3:GetObjectVersion", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:ListBucketVersions", "s3:ListMultipartUploadParts", "s3:PutBucketVersioning", "s3:PutObject", "s3:PutObjectTagging" ], "Resource": [ "arn:aws:s3:::my-data-bucket-in-s3-for-emrfs-reads-and-writes", "arn:aws:s3:::my-data-bucket-in-s3-for-emrfs-reads-and-writes/*" ] }, { "Effect": "Allow", "Action": [ "dynamodb:CreateTable", "dynamodb:BatchGetItem", "dynamodb:BatchWriteItem", "dynamodb:PutItem", "dynamodb:DescribeTable", "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:Scan", "dynamodb:Query", "dynamodb:UpdateItem", "dynamodb:DeleteTable", "dynamodb:UpdateTable" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/EmrFSMetadata" }, { "Effect": "Allow", "Action": [ "cloudwatch:PutMetricData", "dynamodb:ListTables", "s3:ListBucket" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "sqs:GetQueueUrl", "sqs:ReceiveMessage", "sqs:DeleteQueue", "sqs:SendMessage", "sqs:CreateQueue" ], "Resource": "arn:aws:sqs:us-west-2:123456789012:EMRFS-Inconsistency-*" } ] }

Amazon S3에 로그 파일 아카이브

다음 정책 명령문은 Amazon EMR 클러스터가 지정된 Amazon S3 위치에 로그 파일을 아카이브하는 것을 허용합니다. 아래 예제에서는 클러스터가 생성될 때 콘솔에서 로그 폴더 S3 위치를 사용하거나 AWS CLI의 --log-uri 옵션을 사용하거나 RunJobFlow 명령의 LogUri 파라미터를 사용하여 s3://MyLoggingBucket/MyEMRClusterLogs를 지정합니다. 자세한 내용은 Amazon S3에 로그 파일 아카이브 단원을 참조하십시오.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::MyLoggingBucket/MyEMRClusterLogs/*" } ] }

AWS Glue 데이터 카탈로그 사용

다음 정책 명령문에서는 AWS Glue 데이터 카탈로그를 애플리케이션에 대한 메타스토어로 사용하는 경우에 필요한 작업을 허용합니다. 자세한 내용은 Amazon EMR 릴리스 안내서에서 AWS Glue 데이터 카탈로그를 Spark SQL용 메타스토어로 사용, AWS Glue 데이터 카탈로그를 Hive용 메타스토어로 사용AWS Glue 데이터 카탈로그에서 Presto 사용을 참조하세요.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:CreateDatabase", "glue:UpdateDatabase", "glue:DeleteDatabase", "glue:GetDatabase", "glue:GetDatabases", "glue:CreateTable", "glue:UpdateTable", "glue:DeleteTable", "glue:GetTable", "glue:GetTables", "glue:GetTableVersions", "glue:CreatePartition", "glue:BatchCreatePartition", "glue:UpdatePartition", "glue:DeletePartition", "glue:BatchDeletePartition", "glue:GetPartition", "glue:GetPartitions", "glue:BatchGetPartition", "glue:CreateUserDefinedFunction", "glue:UpdateUserDefinedFunction", "glue:DeleteUserDefinedFunction", "glue:GetUserDefinedFunction", "glue:GetUserDefinedFunctions" ], "Resource": "*", } ] }