Hdfs到s3 Distcp - 访问密钥

时间:2016-07-22 12:01:51

标签: hadoop amazon-s3 hdfs distcp

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

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

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

5 个答案:

答案 0 :(得分:3)

我也面临同样的情况,并从matadata实例获得临时凭证。 (如果您使用的是IAM用户的凭证,请注意这里提到的临时凭证是IAM角色,它附加到EC2服务器而不是人类,请参考http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html

我发现只指定hadoop distcp cmd中的凭据不起作用。 您还必须指定配置fs.s3a.aws.credentials.provider。 (参考http://hortonworks.github.io/hdp-aws/s3-security/index.html#using-temporary-session-credentials

最终命令如下所示

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

答案 1 :(得分:1)

亚马逊允许生成可以从http://169.254.169.254/latest/meta-data/iam/security-credentials/

检索的临时凭证

您可以阅读from there

  

实例上的应用程序从实例元数据项 iam / security-credentials / 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和Windows PowerShell工具会自动从中获取凭据EC2实例元数据服务并使用它们。要使用临时安全凭证在实例外部进行调用(例如,测试IAM策略),您必须提供访问密钥,密钥和会话令牌。有关详细信息,请参阅IAM用户指南中的Using Temporary Security Credentials to Request Access to AWS Resources

答案 2 :(得分:1)

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

粉丝:如果您在EC2中运行,则应从默认的凭据提供商链中自动获取IAM角色凭证:查找配置选项& env vars,它尝试EC2 http端点的GET,它提供会话凭证。如果没有发生这种情况,请确保com.amazonaws.auth.InstanceProfileCredentialsProvider位于凭据提供商列表中。它比其他人慢一些(并且可以受到限制),所以最好接近尾声。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

不确定是否是由于版本差异引起的,但是要使用“来自凭据提供者的秘密” -Dfs标志对我来说不起作用,我必须使用-D标志,如下所示hadoop version 3.1.3 "Using_secrets_from_credential_providers" docs

首先,我将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