EMR에서 다른 계정의 S3 버킷 로드
하고 싶었던 일
Spark에서 실행되는 분산 처리 응용 프로그램이 있습니다. 내용으로서는 다른 계정의 S3의 로그 파일을 읽고, 자신의 계정의 S3에 정형된 로그를 배치한다.
해결책
크로스 계정 정보(AWS STS)를 사용하여 임시 자격 증명을 Spark에 로드하고 사용하려고 했습니다.
이번에는 1, 2의 소개를 합니다.
특정 AWS 계정에서 읽을 수 있도록 버킷 정책 변경
S3을 열고 버킷 정책 추가를 선택합니다.
하기를 추가한다(기존의 정책이 있다고 생각하므로 필요한 부분만 사용해 주세요)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GetObject",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::AWSアカウント番号:root"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::読み込ませたいバケット/*"
},
{
"Sid": "ListBucket",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::AWSアカウント番号root"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::読みこませたいバケット"
}
]
}
STS를 사용한 인증으로 EMR에서 S3에 액세스할 수 없는 이유
결론부터 말하면 hadoop ver 2.7.2에서는, 일시 인증이 대응하고 있지 않다?
spark에서 자격 증명은 다음과 같은 코드를 작성합니다 (Scala의 코드입니다)
sc.hadoopConfiguration.set("fs.s3.awsAccessKeyId", xxxxxxxxxx)
sc.hadoopConfiguration.set("fs.s3.awsSecretAccessKey", xxxxxxxxxx)
임시 인증 획득은 다음과 같습니다 (python)
import sys, codecs, boto3
import datetime
import csv
import gzip
sts_client = boto3.client('sts')
assumedRoleObject = sts_client.assume_role(
RoleArn="arn:aws:iam::クロスアカウントを設定したIamRole",
RoleSessionName="セッションに使う名前(適当でOKかも?)"
)
aws_access_key_id = credentials['AccessKeyId'],
aws_secret_access_key = credentials['SecretAccessKey'],
aws_session_token = credentials['SessionToken']
위와 같이 얻은
를 사용하여 파이썬에서 다른 계정의 S3을로드 할 수있었습니다.
같은 방식으로 스파크에서 시도하려고하면,
세션 토큰 어떻게 넣을까?
라는 문제에 부딪혔습니다.
hadoop의 공식 사이트에도 액세스 키, 시크릿 키의 2개 밖에 대응하고 있는 것 같은
할 수 없다는 잡담이 공식 이슈로 오르고 있는 것 같습니다.
htps : // 일단 s. 아파치. 오 rg / 지라 / b 로 w 세 / 하도오 P-9680
결론
요전날(2016/08/03), EMR의 메이저 업데이트가 있었습니다.
이 단계에서 여전히 hadoop은 2.7.2로 남아있었습니다.
향후 업데이트로 임시 인증에 대응할지도 모르지만,
지금은 버킷 자체에 액세스 허가를 하는 것이 가장 빠를지도.
Reference
이 문제에 관하여(EMR에서 다른 계정의 S3 버킷 로드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/RyujiKawazoe/items/5ed54c48a12793b3776c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)