복붙노트

[HADOOP] org.apache.hadoop.security.AccessControlException : EC2에서 Hadoop Java API를 사용하여 S3 버킷을 통해 S3 버킷에 액세스하려고하면 권한이 거부되었습니다.

HADOOP

org.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. ==============================

    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에서 :

  2. from https://stackoverflow.com/questions/28024570/org-apache-hadoop-security-accesscontrolexception-permission-denied-when-trying by cc-by-sa and MIT license