Hdfs到s3 Distcp-访问密钥



为了将文件从HDFS复制到S3 bucket,我使用了命令

hadoop distcp -Dfs.s3a.access.key=ACCESS_KEY_HERE
-Dfs.s3a.secret.key=SECRET_KEY_HERE /path/in/hdfs s3a:/BUCKET NAME

但是访问密钥和扇区密钥在这里是可见的,这是不安全的。是否有任何方法可以从文件中提供凭据。我不想编辑配置文件,这是我遇到的方法之一。

我也面临同样的情况,并且在从matadata实例获得临时凭据之后。(如果您使用的是IAM用户凭据,请注意此处提到的临时凭据是IAM角色,它连接到EC2服务器而非人工,请参阅http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)

我发现仅在hadoop distcp命令中指定凭据将不起作用。您还必须指定一个配置fs.s3a.aws.credentials.provider。(参考http://hortonworks.github.io/hdp-aws/s3-security/index.html#using-临时会话凭据)

最终命令如下所示

hadoop distcp -Dfs.s3a.aws.credentials.provider="org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider" -Dfs.s3a.access.key="{AccessKeyId}" -Dfs.s3a.secret.key="{SecretAccessKey}" -Dfs.s3a.session.token="{SessionToken}" s3a://bucket/prefix/file /path/on/hdfs

最近的(2.8+)版本允许您在jceks文件中隐藏凭据;Hadoops3页面上有一些文档。这样:根本不需要把任何秘密放在命令线上;您只需在集群中共享它们,然后在distcp命令中,将hadoop.security.credential.provider.path设置为路径,如jceks://hdfs@nn1.example.com:9001/user/backup/s3.jceks

Fan:如果您在EC2中运行,IAM角色凭据应该自动从凭据提供程序的默认链中获取:在查找配置选项&env-vars,它尝试获取提供会话凭据的EC2http端点。如果没有发生这种情况,请确保com.amazonaws.auth.InstanceProfileCredentialsProvider在凭据提供程序列表中。它比其他的慢一点(可能会被节流),所以最好放在接近尾声的地方。

Amazon允许生成临时凭据,您可以从中检索http://169.254.169.254/latest/meta-data/iam/security-credentials/

你可以从那里阅读

实例上的应用程序从实例元数据项iam/security-credients/role name中检索角色提供的安全凭据。通过与角色关联的安全凭据,应用程序被授予您为角色定义的操作和资源的权限。这些安全凭据是临时的,我们会自动轮换它们。我们在旧凭据到期前至少五分钟提供新凭据。

以下命令检索名为s3access的IAM角色的安全凭据。

$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access

以下是示例输出。

{
  "Code" : "Success",
  "LastUpdated" : "2012-04-26T16:39:16Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "AKIAIOSFODNN7EXAMPLE",
  "SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
  "Token" : "token",
  "Expiration" : "2012-04-27T22:39:16Z"
}

对于在实例上运行的应用程序、AWS CLI和Tools For Windows PowerShell命令,您不必显式获取临时安全凭据——AWS SDK、AWS CLI以及Tools For Windows PowerShell会自动从EC2实例元数据服务获取凭据并使用它们。要使用临时安全凭据在实例外部进行调用(例如,测试IAM策略),必须提供访问密钥、密钥和会话令牌。有关更多信息,请参阅IAM用户指南中的使用临时安全凭据请求访问AWS资源。

如果您不想使用访问权限和密钥(或在脚本中显示它们),并且如果您的EC2实例可以访问S3,则可以使用实例凭据

hadoop distcp 
-Dfs.s3a.aws.credentials.provider="com.amazonaws.auth.InstanceProfileCredentialsProvider" 
/hdfs_folder/myfolder 
s3a://bucket/myfolder

不确定是否是因为版本差异,但要使用"凭据提供商的机密",-Dfs标志对我不起作用,我必须使用hadoop 3.1.3版"Using_secrets_from_credential_providers"文档中所示的-D标志。

首先,我将我的AWS S3凭据保存在Java加密扩展密钥存储(JCEKS)文件中。

hadoop credential create fs.s3a.access.key 
-provider jceks://hdfs/user/$USER/s3.jceks 
-value <my_AWS_ACCESS_KEY>
hadoop credential create fs.s3a.secret.key 
-provider jceks://hdfs/user/$USER/s3.jceks 
-value <my_AWS_SECRET_KEY>

然后下面的distcp命令格式对我有效

hadoop distcp 
-D hadoop.security.credential.provider.path=jceks://hdfs/user/$USER/s3.jceks 
/hdfs_folder/myfolder 
s3a://bucket/myfolder

最新更新