[HADOOP] org.apache.hadoop.security.AccessControlException : EC2에서 Hadoop Java API를 사용하여 S3 버킷을 통해 S3 버킷에 액세스하려고하면 권한이 거부되었습니다.
HADOOPorg.apache.hadoop.security.AccessControlException : EC2에서 Hadoop Java API를 사용하여 S3 버킷을 통해 S3 버킷에 액세스하려고하면 권한이 거부되었습니다.
EC2를 신뢰할 수있는 엔터티로 지정하는 "my-role"이라는 AWS IAM 역할을 만듭니다. 즉, 트러스트 관계 정책 문서를 사용합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
역할에는 다음과 같은 정책이 있습니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetBucketAcl",
"s3:GetBucketCORS",
"s3:GetBucketLocation",
"s3:GetBucketLogging",
"s3:GetBucketNotification",
"s3:GetBucketPolicy",
"s3:GetBucketRequestPayment",
"s3:GetBucketTagging",
"s3:GetBucketVersioning",
"s3:GetBucketWebsite",
"s3:GetLifecycleConfiguration",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectTorrent",
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl",
"s3:GetObjectVersionTorrent",
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:ListBucketVersions",
"s3:ListMultipartUploadParts",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectVersionAcl",
"s3:RestoreObject"
],
"Resource": [
"arn:aws:s3:::my-bucket/*"
]
}
]
}
AWS CLI를 사용하여 명령 줄에서 EC2 인스턴스 (Amazon Linux 2014.09.1)를 시작하고 인스턴스 프로필로 "my-role"을 지정하면 모든 것이 잘됩니다. 다음을 실행하여 인스턴스가 "my-role"을 효과적으로 가정하는지 확인합니다.
이러한 자격 증명 검색 응답의 예는 다음과 같습니다.
{
"Code" : "Success",
"LastUpdated" : "2015-01-19T10:37:35Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "an-access-key-id",
"SecretAccessKey" : "a-secret-access-key",
"Token" : "a-token",
"Expiration" : "2015-01-19T16:47:09Z"
}
그런 인스턴스에 Tomcat7 서버와 컨테이너를 실행 / 설치합니다.이 인스턴스에는 문제없이 J2EE 1.7 서블릿을 배포합니다.
이러한 서블릿은 S3 파일 (특히 s3 : //my-bucket/custom-path/file.tar.gz)의 파일을 Hadoop Java API를 사용하여 로컬 파일 시스템에 다운로드해야합니다. (제발, hadoop-common artifact 2.4.x, 2.5.x, 2.6.x를 긍정적 인 결과없이 시도했음을 주목하십시오. 2.5.x를 사용할 때 예외를 게시 할 것입니다)
서블릿 내에서 위에서 언급 한 인스턴스 메타 데이터 URL에서 새로운 자격 증명을 검색하고이를 사용하여 Hadoop Java API 인스턴스를 구성합니다.
...
Path path = new Path("s3n://my-bucket/");
Configuration conf = new Configuration();
conf.set("fs.defaultFS", path.toString());
conf.set("fs.s3n.awsAccessKeyId", myAwsAccessKeyId);
conf.set("fs.s3n.awsSecretAccessKey", myAwsSecretAccessKey);
conf.set("fs.s3n.awsSessionToken", mySessionToken);
...
분명히 myAwsAccessKeyId, myAwsSecretAccessKey 및 mySessionToken은 이전에 실제 값으로 설정 한 Java 변수입니다. 그런 다음 FileSystem 인스턴스를 효과적으로 가져옵니다.
FileSystem fs = path.getFileSystem(conf);
FileSystem (fs.getconf (). get (key-name))과 관련된 모든 구성을 검색하고 모든 것이 가정 된 것으로 구성되었는지 확인할 수 있습니다.
다음을 사용하여 s3 : //my-bucket/custom-path/file.tar.gz를 다운로드 할 수 없습니다.
...
fs.copyToLocalFile(false, new Path(path.toString()+"custom-path/file.tar.gz"), outputLocalPath);
...
hadoop-common 2.5.x를 사용하면 IOException이 발생합니다.
hadoop-common 2.4.x를 사용하면 NullPointerException가 발생합니다.
기록을 위해 aws 자격 증명을 설정하지 않으면 다음과 같이 표시됩니다.
긴 게시물에 대해 유감스럽게 생각합니다. 최대한 자세히 설명하려고했습니다. 여기에 도움이 될만한 모든 것에 감사드립니다.
해결법
-
==============================
1.STS / 임시 AWS 자격 증명을 사용하고 있습니다. 이것들은 현재 hadoop에있는 s3 또는 s3n FileSystem 구현에 의해 지원되는 것으로 보이지 않습니다.
STS / 임시 AWS 자격 증명을 사용하고 있습니다. 이것들은 현재 hadoop에있는 s3 또는 s3n FileSystem 구현에 의해 지원되는 것으로 보이지 않습니다.
AWS STS / 임시 자격 증명에는 (액세스 키, 비밀 키)뿐만 아니라 세션 토큰도 포함됩니다. hadoop s3 및 s3n FileSystem은 아직 세션 토큰의 포함을 지원하지 않습니다 (즉, fs.s3n.awsSessionToken의 구성은 지원되지 않고 s3n FileSystem에서 무시됩니다).
AmazonS3에서 - Hadoop Wiki ... (fs.s3.awsSessionToken에 대한 언급은 없습니다).
github.com의 apache / hadoop에서 S3Credentials.java를 살펴보면 세션 토큰의 개념이 S3 자격 증명의 표현에서 완전히 빠져 있음을 알 수 있습니다.
이 제한 사항을 해결하기 위해 제출 된 패치가있었습니다 (자세한 내용은 여기에 있습니다). 그러나, 그것은 통합되지 않았습니다. AWS IAM 인스턴스 역할을 사용하는 경우 Hadoop 2.6.0에 추가 된 새로운 s3a FileSystem을 사용하여 탐색 할 수 있습니다. IAM 역할 기반 인증 (즉, 키를 명시 적으로 지정하지 않아도 됨)을 지원한다고 주장합니다.
Hadoop JIRA 티켓은 s3a FileSystem을 구성하는 방법을 설명합니다.
https://issues.apache.org/jira/browse/HADOOP-10400에서 :
from https://stackoverflow.com/questions/28024570/org-apache-hadoop-security-accesscontrolexception-permission-denied-when-trying by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 하이브 JDBC Kerberos 연결 오류 (0) | 2019.07.24 |
---|---|
[HADOOP] modify hadoop-env.sh를 제외하고 hadoop에서 시스템 속성을 지정하는 방법? (0) | 2019.07.24 |
[HADOOP] HBase 대 하이브 대 HDFS 대 하이브 (0) | 2019.07.24 |
[HADOOP] HIVE의 분산 캐시에 여러 파일 추가 (0) | 2019.07.24 |
[HADOOP] 'yarn application -list'는 결과를 보여주지 못한다. (0) | 2019.07.24 |