可以在外部阶段列出文件但不能访问其中的文件?
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": "*"
如果集成只需要对存储桶内容的读取权限,您应该只需要 Decrypt
和 GenerateDataKey
【讨论】:
检查 KMS 权限的建议对我有用。【参考方案2】:在 AWS 上,列出对象和访问对象需要不同的权限。您确定 IAM 用户有权访问这些文件吗?您提到单独账户中的lambda函数,上传对象时,是否给“bucket-owner-full-control”?
How change S3 file ownership while cross-account uploading
【讨论】:
【参考方案3】:作为记录,我建议第一个选项 - 创建存储集成,因为在此过程中无需输入凭据。
但要回答您的问题,请确保在策略中授予 s3:GetObject 和 s3:GetObjectVersion 权限,现在可能缺少。
【讨论】:
以上是关于可以在外部阶段列出文件但不能访问其中的文件?的主要内容,如果未能解决你的问题,请参考以下文章