4

为了将文件从 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 密钥,这是不安全的。有什么方法可以从文件中提供凭据。我不想编辑配置文件,这是我遇到的方法之一。

4

5 回答 5

5

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

我发现只在hadoop distcpcmd 中指定凭据是行不通的。您还必须指定一个 config 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
于 2017-12-01T07:13:33.183 回答
2

亚马逊允许生成临时凭证,您可以从http://169.254.169.254/latest/meta-data/iam/security-credentials/检索这些凭证

你可以从那里阅读

实例上的应用程序从实例元数据项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 和适用于 Windows PowerShell 的工具命令,您不必显式获取临时安全凭证 — AWS 开发工具包、AWS CLI 和适用于 Windows PowerShell 的工具会自动从 EC2 实例获取凭证元数据服务并使用它们。要使用临时安全凭证在实例外部进行调用(例如,测试 IAM 策略),您必须提供访问密钥、秘密密钥和会话令牌。有关更多信息,请参阅IAM 用户指南中的使用临时安全凭证请求访问 AWS 资源

于 2016-07-22T12:25:05.257 回答
2

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

范:如果你在 EC2 中运行,IAM 角色凭证应该从默认的凭证提供者链中自动获取:在查找配置选项和环境变量后,它会尝试提供会话的 EC2 http 端点的 GET证书。如果这没有发生,请确保它com.amazonaws.auth.InstanceProfileCredentialsProvider在凭证提供者列表中。它比其他的慢一点(并且可能会受到限制),所以最好放在最后。

于 2017-12-06T10:26:30.777 回答
0

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

hadoop distcp \
-Dfs.s3a.aws.credentials.provider="com.amazonaws.auth.InstanceProfileCredentialsProvider" \
/hdfs_folder/myfolder \
s3a://bucket/myfolder
于 2018-05-15T13:22:40.443 回答
0

不确定是否是因为版本差异,但要使用“来自凭证提供者的秘密”,该-Dfs标志对我不起作用,我必须使用hadoop 版本 3.1.3“Using_secrets_from_credential_providers”文档-D中显示的标志。

首先,我将 AWS S3 凭证保存在 Java Cryptography Extension KeyStore (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
于 2020-04-27T19:12:45.033 回答