如何在Snowflake存储集成中正确使用STORAGE_BLOCKED_LOCATIONS?
解决Snowflake存储集成阻止特定文件夹时创建父路径阶段的报错问题
你遇到的问题核心是Snowflake存储集成的路径匹配规则:当STORAGE_ALLOWED_LOCATIONS设置为父路径(如s3://snowflake-assgnmt/),同时STORAGE_BLOCKED_LOCATIONS设置其子路径(如s3://snowflake-assgnmt/secretFolder/)时,创建指向父路径的外部阶段会被判定为包含被阻止的子路径,因此触发权限限制报错。
以下两种方案可以实现限制存储桶中特定文件夹的需求:
方案1:明确指定所有允许的子路径(不使用父路径作为允许项)
如果桶内仅需开放部分子文件夹的访问权限,直接将这些允许的子路径列在STORAGE_ALLOWED_LOCATIONS中,同时保留STORAGE_BLOCKED_LOCATIONS阻止敏感文件夹。
示例配置:
CREATE OR REPLACE STORAGE INTEGRATION aws_integration_2 TYPE = EXTERNAL_STAGE STORAGE_PROVIDER = 'S3' ENABLED = TRUE STORAGE_AWS_ROLE_ARN = 'some-value' -- 列出所有需要允许访问的子路径 STORAGE_ALLOWED_LOCATIONS = ('s3://snowflake-assgnmt/public/', 's3://snowflake-assgnmt/data/') STORAGE_BLOCKED_LOCATIONS = ('s3://snowflake-assgnmt/secretFolder/');
之后创建阶段时,指向具体的允许子路径即可:
CREATE OR REPLACE STAGE external_aws_upload_public STORAGE_INTEGRATION = aws_integration_2 URL = 's3://snowflake-assgnmt/public/';
方案2:通过AWS IAM角色权限限制敏感文件夹(保留父路径允许项)
如果必须保留父路径作为允许项,可放弃使用Snowflake的STORAGE_BLOCKED_LOCATIONS,转而通过AWS IAM角色的权限策略直接拒绝访问敏感文件夹,这样既允许父路径阶段的创建,又能阻止对敏感文件夹的访问。
步骤1:修改AWS角色的权限策略
添加拒绝访问secretFolder的规则:
{ "Effect": "Deny", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::snowflake-assgnmt/secretFolder/*", "arn:aws:s3:::snowflake-assgnmt/secretFolder" ] }
步骤2:更新Snowflake存储集成(移除STORAGE_BLOCKED_LOCATIONS)
CREATE OR REPLACE STORAGE INTEGRATION aws_integration_2 TYPE = EXTERNAL_STAGE STORAGE_PROVIDER = 'S3' ENABLED = TRUE STORAGE_AWS_ROLE_ARN = 'some-value' STORAGE_ALLOWED_LOCATIONS = ('s3://snowflake-assgnmt/');
此时创建指向父路径的阶段即可成功,且尝试访问secretFolder时会被IAM权限阻止。
内容的提问来源于stack exchange,提问作者Dhruv
相关产品推荐
相关产品推荐

