每个存储桶 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 指定所有属性并同时对 exampleAWSexamplePureStorage 进行身份验证:

=> 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 的开销,他们需要创建用户存储位置并向每个用户或角色授予访问权限。

  • 用户共享一组凭据,如果凭据泄露,则会增加潜在影响。

每个存储桶和标准参数的优先级

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 提供 AWSBucketPureStorageBucket 的凭据,并同时对其进行身份验证。这允许他执行跨端点联接、从一个存储桶导出到另一个存储桶等。

=> 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": ""
    },
]';