S3读取权限问题雪花

时间:2020-05-14 09:55:22

标签: amazon-s3 snowflake-cloud-data-platform

我正在尝试从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';

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

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

您知道真正的问题是什么吗? 加密出现问题了吗?

4 个答案:

答案 0 :(得分:1)

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

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/*"]
}

答案 1 :(得分:1)

我已在AWS_SSE_KMS的“配置对Amazon的安全访问”文档中使用了选项2。如果您没有完全按照说明进行操作,它将无法正常工作。

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密钥

答案 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帐户。

再次感谢您的帮助。极大地帮助了我。