每个存储桶 S3 配置
您可以使用 S3BucketConfig 和 S3BucketCredentials 配置参数管理各个存储桶的配置和凭据。这些参数均采用 JSON 对象,其各自属性的行为类似于相关的 S3 配置参数。
例如,您可以通过在数据库级别使用 ALTER DATABASE 设置 S3BucketConfig 来为每个 S3 存储桶创建不同的配置。以下 S3BucketConfig 指定了几个常见的存储桶属性:
=> ALTER DATABASE DEFAULT SET S3BucketConfig='
[
{
"bucket": "exampleAWS",
"region": "us-east-2",
"protocol": "https",
"requesterPays": true
},
{
"bucket": "examplePureStorage",
"endpoint": "pure.mycorp.net:1234",
"protocol": "http",
"enableVirtualAddressing": false
}
]';
然后,用户可以通过在会话级别使用 ALTER SESSION 设置 S3BucketCredentials 来访问存储桶。以下 S3BucketCredentials 指定所有属性并同时对 exampleAWS
和 examplePureStorage
进行身份验证:
=> ALTER SESSION SET S3BucketCredentials='
[
{
"bucket": "exampleAWS",
"accessKey": "<AK0>",
"secretAccessKey": "<SAK0>",
"sessionToken": "1234567890"
},
{
"bucket": "examplePureStorage",
"accessKey": "<AK1>",
"secretAccessKey": "<SAK1>",
}
]';
推荐用法
推荐用法如下:
-
在您的 S3 存储系统中为每个主体、每个存储系统定义一组凭据。
-
通常最方便的做法是在数据库级别设置一次 S3BucketConfig,并通过在会话级别设置 S3BucketCredentials 来对用户进行身份验证。
-
要访问在数据库级别配置的存储桶之外的存储桶,请在会话级别设置 S3BucketConfig 和 S3BucketCredentials。
如果您无法为 S3 存储定义凭据,您可以使用 ALTER DATABASE 在数据库级别设置 S3BucketCredentials 或 AWSAuth,但这有一些缺点:
-
将凭据静态存储在另一个位置(在这种情况下,在 Vertica 编录中)总是会带来其他风险。
-
这增加了 dbadmin 的开销,他们需要创建用户存储位置并向每个用户或角色授予访问权限。
-
用户共享一组凭据,如果凭据泄露,则会增加潜在影响。
注意
如果您将 AWSEndpoint 设置为 Pure Storage 或 MinIO 之类的非 Amazon S3 存储系统,并且您想要为实际的 Amazon S3 配置 S3BucketConfig,则适用以下要求:
-
如果您实际的 Amazon S3 区域不是
us-east-1
(默认值),则必须指定region
。 -
将
endpoint
设置为空字符串 (""
)。=> ALTER DATABASE DEFAULT SET S3BucketConfig=' [ { "bucket": "additionalAWSBucket", "region": "us-east-2", "endpoint": "" } ]';
每个存储桶和标准参数的优先级
Vertica 使用以下规则来确定 S3 连接的有效属性集:
-
如果设置,则 S3BucketCredentials 将优先于其标准参数。S3BucketCredentials 首先在会话级别检查,然后在数据库级别检查。
-
S3 凭据参数的级别/来源决定了 S3 配置参数的来源:
-
如果凭据来自会话级别,则配置可以来自会话级别或数据库级别(会话级别优先)。
-
如果您的凭据来自数据库级别,那么配置只能来自数据库级别。
-
-
如果设置了 S3BucketConfig,它将优先于其标准参数。如果未指定 S3BucketConfig 属性,则 Vertica 将回退到缺失属性的等效参数。例如,如果 S3BucketConfig 指定除
protocol
之外的所有属性,则 Vertica 将回退到标准参数AWSEnableHttps
。
示例
多个存储桶
此示例使用 S3BucketConfig 配置一个实际的 Amazon S3 存储桶 AWSBucket
和一个 Pure Storage 存储桶 PureStorageBucket
。
AWSBucket
没有指定 endpoint
或协议,因此 Vertica 回退到 AWSEndpoint
(默认为 s3.amazonaws.com
)和 AWSEnableHttps(默认为 1
)。
在此示例环境中,对 PureStorageBucket
的访问是通过安全网络进行的,因此 HTTPS 被禁用:
=> ALTER DATABASE DEFAULT SET S3BucketConfig='
[
{
"bucket": "AWSBucket",
"region": "us-east-2"
},
{
"bucket": "PureStorageBucket",
"endpoint": "pure.mycorp.net:1234",
"protocol": "http",
"enableVirtualAddressing": false
}
]';
然后 Bob 可以在会话级别设置 S3BucketCredentials 以向 AWSBucket
进行身份验证:
=> ALTER SESSION SET S3BucketCredentials='
[
{
"bucket": "AWSBucket",
"accessKey": "<AK0>",
"secretAccessKey": "<SAK0>",
"sessionToken": "1234567890"
}
]';
同样,Alice 可以向 PureStorageBucket
进行身份验证:
=> ALTER SESSION SET S3BucketCredentials='
[
{
"bucket": "PureStorageBucket",
"accessKey": "<AK1>",
"secretAccessKey": "<SAK1>"
}
]';
Charlie 提供 AWSBucket
和 PureStorageBucket
的凭据,并同时对其进行身份验证。这允许他执行跨端点联接、从一个存储桶导出到另一个存储桶等。
=> ALTER SESSION SET S3BucketCredentials='
[
{
"bucket": "AWSBucket",
"accessKey": "<AK0>",
"secretAccessKey": "<SAK0>",
"sessionToken": "1234567890"
},
{
"bucket": "PureStorageBucket",
"accessKey": "<AK1>",
"secretAccessKey": "<SAK1>"
}
]';
S3 服务器端加密
S3 具有三种类型的服务器端加密:SSE-S3、SSE-KMS 和 SSE-C。以下示例使用 SSE-KMS 配置访问:
=> ALTER DATABASE DEFAULT SET S3BucketConfig='
[
{
"bucket": "AWSBucket",
"region": "us-east-2",
"serverSideEncryption": "aws:kms",
"sseKmsKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
}
]';
有关详细信息,请参阅服务器端加密。
具有 AWSEndpoint 和 S3BucketConfig 的非 Amazon S3 存储
如果 AWSEndpoint 设置为 Pure Storage 或 MinIO 之类的非 Amazon S3 存储桶,并且您想要为实际的 Amazon S3 存储桶配置 S3BucketConfig,则适用以下要求:
-
如果您实际的 Amazon S3 区域不是
us-east-1
(默认值),则必须指定region
。 -
将
endpoint
设置为空字符串 (""
)。
在此示例中,AWSEndpoint 设置为 Pure Storage 存储桶。
=> ALTER DATABASE DEFAULT SET AWSEndpoint='pure.mycorp.net:1234';
要为区域“us-east-2
”中的实际 Amazon S3 存储桶 realAmazonS3Bucket
配置 S3BucketConfig:
=> ALTER DATABASE DEFAULT SET S3BucketConfig='
[
{
"bucket": "realAmazonS3Bucket",
"region": "us-east-2",
"endpoint": ""
},
]';