可以在外部阶段列出文件但不能访问其中的文件?

Posted

技术标签:

【中文标题】可以在外部阶段列出文件但不能访问其中的文件?【英文标题】:Can list files in an external stage but cannot access files within it? 【发布时间】:2020-02-13 23:58:24 【问题描述】:

我今天更新了 S3 存储桶策略,以允许单独账户中的 lambda 函数将对象放入该存储桶。 不知何故,当我更新该策略时,我打破了我在 Snowflake 中的外部阶段。

我可以运行list@stage/subfolder 命令并查看舞台中所有文件名的列表。 但是,如果我尝试

SELECT metadata$filename FROM @stage/subfolder

我收到Failed to access remote file: access denied. Please check your credentials 错误。

我通过第三个选项 (https://docs.snowflake.net/manuals/user-guide/data-load-s3-config.html) 连接到雪花。我已经建立了一个 IAM 用户,并在建立外部阶段时提供了访问密钥 ID/秘密访问密钥。 在我对存储桶策略进行单独更改之前,一切正常。

list @stage 但不能从舞台上选择的功能是否对任何人敲响了警钟?如果没有,我很乐意提供我创建的政策的更多细节。

【问题讨论】:

我自己遇到了这个问题 - 你找到解决方案了吗? 【参考方案1】:

请参阅雪花的ERROR: "FAILED TO ACCESS REMOTE FILE: ACCESS DENIED. PLEASE CHECK YOUR CREDENTIALS" 故障排除文档:

这个错误可能是由几个不同的原因造成的。

    由于创建阶段时定义的凭据不正确 使用存储集成或 IAM 角色设置时,访问策略未正确将资源包含到存储桶中 在加密存储桶时,访问策略可能没有列出 KMS 密钥 ID。

如果您能够使用您创建的存储集成列出存储桶的内容,我高度怀疑它与存储桶加密有关。您可以通过以下方式添加 KMS 密钥访问:

"Sid": "Allow use of the key",
"Effect": "Allow",
"Principal": 
    "AWS": "arn:aws:iam::xxxxxx"
,
"Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*",
    "kms:DescribeKey"
],
"Resource": "*"

如果集成只需要对存储桶内容的读取权限,您应该只需要 DecryptGenerateDataKey

【讨论】:

检查 KMS 权限的建议对我有用。【参考方案2】:

在 AWS 上,列出对象和访问对象需要不同的权限。您确定 IAM 用户有权访问这些文件吗?您提到单独账户中的lambda函数,上传对象时,是否给“bucket-owner-full-control”?

How change S3 file ownership while cross-account uploading

【讨论】:

【参考方案3】:

作为记录,我建议第一个选项 - 创建存储集成,因为在此过程中无需输入凭据。

但要回答您的问题,请确保在策略中授予 s3:GetObject 和 s3:GetObjectVersion 权限,现在可能缺少。

【讨论】:

以上是关于可以在外部阶段列出文件但不能访问其中的文件?的主要内容,如果未能解决你的问题,请参考以下文章

在外部 js 文件中使用会话

12类成员访问修饰符public/private/producted/readonly

在外部蓝牙设备和 Android 手机之间传输音频

为啥我不能在外部定义嵌套类?

如何在外网访问SVN服务器?

vscodec语言怎么不能在外部运行直接退出