权限问题 S3 中的雪花读取



我正在尝试从 S3(加密(读取一个简单的 csv 文件,但一直遇到各种问题......

我创建了一个 IAM 用户(仅限编程访问(,将访问密钥 ID 和秘密访问密钥放在一边。

我为该用户提供了策略,我理解该策略应该赋予它对存储桶中所有内容的读/写访问权限

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:GetObjectVersion",
"s3:DeleteObject",
"s3:DeleteObjectVersion"
],
"Resource": [
"arn:aws:s3:::my_bucket",
"arn:aws:s3:::my_bucket/*"
]
},
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": [
"arn:aws:s3:::my_bucket"
],
"Condition": {
"StringLike": {
"s3:prefix": [
"*"
]
}
}
}
]
}

已创建舞台

create or replace stage my_s3_stage
url='s3://my_bucket/'
credentials=(aws_key_id='...' aws_secret_key='...')
encryption=(type='AWS_SSE_KMS' kms_key_id = 'f03...aee');

在该阶段,我可以列出存储桶/阶段中的对象

list @my_s3_stage;

目前为止,一切都好。

然后我创建了一个简单的表

create or replace TABLE mytable (col1 String null, col2 string null, col3 string null);

但是后来我遇到了有关权限的错误消息......

copy into mytable from @my_s3_stage pattern='.*.csv';

无法访问远程文件:访问被拒绝。请检查您的凭据

我可以列出文件的事实不是表明我的凭据是正确的吗?

知道真正的问题是什么吗? 我在加密方面有问题吗?

据我所知,缺少权限。您的 IAM 用户需要具有解密 S3 中的对象的权限,这就是为什么当您列出存储桶中的内容时有效,但只要您尝试复制,就会出错。 尝试为您的用户使用此策略(我缩小了您需要从 S3 中读取的内容,即所有 List* 和 Get* 权限(:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:List*" 
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*",
],
"Resource": [
"arn:aws:s3:::my_bucket",
"arn:aws:s3:::my_bucket/*"
]
}
]
}

如果这有效,请确保仅将您使用的 kms 密钥添加到策略中。

此外,最佳实践是使用 IAM 角色而不是 IAM 用户,以避免复制粘贴密钥。

也许缺少某些对象权限。你能检查以下链接吗?

https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_s3_rw-bucket-console.html

使用 s3*Object 可能有助于解决此问题:

{
"Effect": "Allow",
"Action": "s3:*Object",
"Resource": ["arn:aws:s3:::my_bucket/*"]
}

我在"配置对亚马逊的安全访问"文档中使用了选项 2 进行AWS_SSE_KMS。 如果您不完全按照说明进行操作,它将不起作用。

https://docs.snowflake.com/en/user-guide/data-load-s3-config.html#option-2-configuring-an-aws-iam-role

步骤应如下所示: 1. 使用网络策略创建角色 2. 创建 IAM 用户 3. 使用具有指定角色的用户创建 KMS 密钥 4. 创建阶段命令,指定凭证,包括 AWS 角色和 KMS 密钥

谢谢大家的有用评论。

最后让我失望的是,每次重新创建 Snowflake 存储集成对象(使用"创建或替换"语句很容易(,都会重新生成 AWS 外部 ID,从而使我与 Snowflake AWS 账户的 AWS 角色信任关系无效。

再次感谢您的帮助。对我帮助很大。

最新更新