我正在尝试从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';
无法访问远程文件:访问被拒绝。请检查您的凭据
我可以列出文件的事实不是表明我的凭据正确吗?
您知道真正的问题是什么吗? 加密出现问题了吗?
答案 0 :(得分:1)
也许缺少某些对象权限。您可以检查以下链接吗?
使用s3 * Object可能有助于解决该问题:
{
"Effect": "Allow",
"Action": "s3:*Object",
"Resource": ["arn:aws:s3:::my_bucket/*"]
}
答案 1 :(得分:1)
我已在AWS_SSE_KMS的“配置对Amazon的安全访问”文档中使用了选项2。如果您没有完全按照说明进行操作,它将无法正常工作。
步骤应如下: 1.使用适当的网络策略创建角色 2.创建IAM用户 3.使用具有指定角色的用户创建KMS密钥 4.创建阶段命令以指定凭证,包括AWS角色和KMS密钥
答案 2 :(得分:1)
据我所知,缺少权限。您的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用户,以避免在周围复制粘贴密钥。
答案 3 :(得分:0)
谢谢大家的有用评论。
让我烦恼的最后一件事是,每当重新创建一个Snowflake STORAGE INTEGRATION对象(使用“ CREATE OR REPLACE”语句很容易)时,都会重新生成AWS External ID,从而使我的AWS Role信任关系无效。 Snowflake AWS帐户。
再次感谢您的帮助。极大地帮助了我。