S3 对象存储

使用 S3 协议的文件系统,包括 AWS、Pure Storage 和 MinIO。

URI 格式

s3://bucket/path

对于 AWS,使用 AWSRegion 配置参数而不是 URI 指定区域。如果区域不正确,可能会在加载失败之前遇到延迟,因为 Vertica 在放弃之前会进行多次重试。默认区域为 us-east-1

身份验证

对于 AWS:

  • 要访问 S3,您必须创建一个 IAM 角色并向该角色授予访问 S3 资源的权限。

  • 默认情况下,存储桶访问仅限于公共存储桶。使用 AWS 访问密钥从非公共存储桶加载数据。

  • 设置 AWSAuth 配置参数以提供凭据或为 S3 路径创建 USER 存储位置(请参阅 CREATE LOCATION)并授予用户访问权限。

  • 您可以使用 AWS STS 临时会话令牌来加载数据。因为这些令牌是会话令牌,所以不要将其用于访问存储位置。

  • 您可以使用每个存储桶的参数 S3BucketConfig 和 S3BucketCredentials 单独配置 S3 存储桶。有关详细信息,请参阅每个存储桶 S3 配置

配置参数

以下数据库配置参数适用于 S3 文件系统。您可以使用适当的 ALTER 语句设置不同级别的参数,例如 ALTER SESSION...SET PARAMETER。 查询 CONFIGURATION_PARAMETERS 系统表以确定哪些级别(节点、会话、用户、数据库)对给定参数有效。

您可以使用 S3BucketConfig 和 S3BucketCredentials 参数而不是全局参数来配置单个存储桶。

有关与 S3 相关的所有参数的详细信息,请参阅S3 参数

AWSAuth
用于身份验证的 ID 和密钥。AWS 调用这些 AccessKeyID 和 SecretAccessKey。为了获得更高的安全性,请不要将凭据存储在数据库中;应当使用 ALTER SESSION...SET PARAMETER 仅为当前会话设置此值。
AWSCAFile
要使用的 TLS 服务器证书捆绑包的文件名。在 SUSE Linux Enterprise Server 上安装 CA 证书时必须设置一个值。
AWSCAPath
Vertica 用于查找 TLS 服务器证书的路径。在 SUSE Linux Enterprise Server 上安装 CA 证书时必须设置一个值。
AWSEnableHttps
布尔值,连接 S3 时是否使用 HTTPS 协议。只能在数据库级别设置。您可以使用 S3BucketConfig 为各个存储桶设置协议。

默认值: 1(启用)

AWSEndpoint
字符串,所有 S3 URL 的端点主机,设置如下:
  • AWS:hostname_or_IP:port。不要包括架构 (http(s))。

  • 具有符合 FIPS 规范的 S3 端点的 AWS:符合 FIPS 规范的 S3 端点的主机名。您还必须启用 S3EnableVirtualAddressing。

  • 本地/Pure:Pure Storage 服务器的 IP 地址。

如果未设置,Vertica 将使用虚拟托管的请求 URL。

默认值: “s3.amazonaws.com”

AWSLogLevel
日志级别,为以下之一:OFF、FATAL、ERROR、WARN、INFO、DEBUG 或 TRACE。

默认值: ERROR

AWSRegion
包含要从中读取文件的 S3 存储桶的 AWS 区域。此参数一次只能配置一个区域。未能设置正确的区域可能会导致在查询失败之前遇到延迟。

默认值: “us-east-1”

AWSSessionToken
通过运行 get-session-token 命令生成的临时安全令牌,用于配置多重身份验证。
AWSStreamingConnectionPercentage
在 Eon 模式下,用于流式读取的公共存储连接数。在云环境中,此设置有助于防止流式数据传输耗尽所有可用的文件句柄。使用本地对象存储时不需要此设置,因为其延迟较低。
S3BucketConfig
指定每个存储桶配置的 JSON 对象。除了存储桶名称之外的每个属性都有一个相应的配置参数。如果同时设置了数据库级别参数及其在 S3BucketConfig 中的等效项,则 S3BucketConfig 中的值优先。

属性:

  • bucket:存储桶名称

  • region (AWSRegion)

  • protocol:架构,httphttps 之一;覆盖 AWSEnableHttps

  • endpoint (AWSEndpoint)

  • enableVirtualAddressing:布尔值,是否重写 S3 URL 以使用虚拟托管路径 (S3BucketCredentials)

  • requesterPays (S3RequesterPays)

  • serverSideEncryption (S3ServerSideEncryption)

  • sseCustomerAlgorithm (S3SseCustomerAlgorithm)

  • sseCustomerKey (S3SseCustomerKey)

  • sseKmsKeyId (S3SseKmsKeyId)

S3BucketCredentials
指定每个存储桶凭据的 JSON 对象。除了存储桶名称之外的每个属性都有一个相应的配置参数。如果同时设置了数据库级参数及其在 S3BucketCredentials 中的等效项,则 S3BucketCredentials 中的值优先。

属性:

  • bucket:存储桶名称

  • accessKey:存储桶的访问密钥(AWSAuth 中的 ID

  • secretAccessKey:存储桶的私密访问密钥(AWSAuth 中的 secret

  • sessionToken:会话令牌,仅在会话级别设置 S3BucketCredentials 时使用 (AWSSessionToken)

此参数仅对超级用户可见。用户可以使用 ALTER SESSION 在会话级别设置此参数。

S3EnableVirtualAddressing
布尔值,是否重写 S3 URL 以使用虚拟托管路径(默认禁用)。此配置设置仅在您为 AWSEndpoint 指定值时生效。

如果您将 AWSEndpoint 设置为符合 FIPS 规范的 S3 端点,则必须启用 S3EnableVirtualAddressing。

此参数的值不会影响指定 S3 路径的方式。

S3RequesterPays
布尔值,请求者(而不是存储桶所有者)是否支付访问存储桶上的数据的费用。
S3ServerSideEncryption
字符串,读取或写入 S3 时使用的加密算法。支持的值为 AES256(对于 SSE-S3)、aws:kms(对于 SSE-KMS)和空字符串(对于不加密)。请参阅服务器端加密

默认值: ""(无加密)

S3SseCustomerAlgorithm
字符串,使用 SSE-C 加密读取或写入 S3 时使用的加密算法。支持的值仅包括 AES256""。对于 SSE-S3 和 SSE-KMS,请改用 S3ServerSideEncryption。

默认值: ""(无加密)

S3SseCustomerKey
如果使用 SSE-C 加密,则为 S3 访问的客户端密钥。
S3SseKmsKeyId
如果使用 SSE-KMS 加密,则将密钥标识符(不是密钥)传递给密钥管理服务。Vertica 必须有权使用通过 KMS 管理的密钥。

服务器端加密

默认情况下,Vertica 读取和写入未加密的 S3 数据。如果 S3 存储桶使用服务器端加密 (SSE),您可以配置 Vertica 来对其进行访问。S3 支持三种类型的服务器端加密:SSE-S3、SSE-KMS 和 SSE-C。

Vertica 还必须对存储桶具有读取或写入权限(取决于操作)。

SSE-S3

对于 SSE-S3,由 S3 服务管理加密密钥。读取不需要额外的配置。要写入 S3,客户端(在本例中为 Vertica)必须只指定加密算法。

如果 S3 存储桶配置了默认加密设置,Vertica 无需进一步更改即可对其读取和写入数据。如果存储桶不使用默认加密设置,请将 S3ServerSideEncryption 配置参数或 S3BucketConfig 中的 serverSideEncryption 字段设置为 AES256

SSE-KMS

对于 SSE-KMS,加密密钥由密钥管理服务 (KMS) 管理。客户端在写入数据时必须提供 KMS 密钥标识符(不是实际密钥)。对于所有操作,客户端必须有权使用 KMS 密钥。这些权限在 KMS 中进行管理,而不是在 Vertica 中。

要使用 SSE-KMS:

  • 将 S3ServerSideEncryption 配置参数或 S3BucketConfig 中的 serverSideEncryption 字段设置为 aws:kms

  • 将 S3SseKmsKeyId 配置参数或 S3BucketConfig 中的 sseKmsKeyId 字段设置为密钥 ID。

SSE-C

对于 SSE-C,由客户端管理加密密钥并将其提供给 S3 以进行每个操作。

要使用 SSE-C:

  • 将 S3SseCustomerAlgorithm 配置参数或 S3BucketConfig 中的 sseCustomerAlgorithm 字段设置为 AES256

  • 将 S3SseCustomerKey 配置参数或 S3BucketConfig 中的 sseCustomerKey 字段设置为访问密钥。该值可以是 32 个字符的纯文本密钥或 44 个字符的 base64 编码密钥。

示例

以下示例设置数据库范围的 AWS 区域和凭据:

=> ALTER DATABASE DEFAULT SET AWSRegion='us-west-1';
=> ALTER DATABASE DEFAULT SET AWSAuth = 'myaccesskeyid123456:mysecretaccesskey123456789012345678901234';

以下示例从 S3 加载数据。如果可以同时加载 glob 中的所有文件,则可以使用 glob。在以下示例中,AWS_DataLake 仅包含 ORC 文件。

=> COPY t FROM 's3://datalake/*' ORC;

您可以指定逗号分隔的 S3 存储桶列表,如下例所示。所有存储桶必须位于同一区域。要从多个区域加载,请使用单独的 COPY 语句并在调用之间更改 AWSRegion 的值。

=> COPY t FROM 's3://AWS_Data_1/sales.parquet', 's3://AWS_Data_2/sales.parquet' PARQUET;

以下示例创建用户存储位置和角色,以便没有自己的 S3 凭据的用户可以使用服务器凭据从 S3 中读取数据。

   --- set database-level credential (once):
=> ALTER DATABASE DEFAULT SET AWSAuth = 'myaccesskeyid123456:mysecretaccesskey123456789012345678901234';

=> CREATE LOCATION 's3://datalake' SHARED USAGE 'USER' LABEL 's3user';

=> CREATE ROLE ExtUsers;
   --- Assign users to this role using GRANT (Role).

=> GRANT READ ON LOCATION 's3://datalake' TO ExtUsers;

给定存储桶的配置属性可能因其类型而异。以下 S3BucketConfig 设置适用于 AWS 存储桶 (AWSBucket) 和 Pure Storage 存储桶 (PureStorageBucket)。 AWSBucket 没有指定端点,因此 Vertica 使用 AWSEndpoint 配置参数,其默认为 s3.amazonaws.com

=> ALTER DATABASE DEFAULT SET S3BucketConfig=
'[
    {
        "bucket": "AWSBucket",
        "region": "us-east-2",
        "protocol": "https",
        "requesterPays": true,
        "serverSideEncryption": "aes256"
    },
    {
        "bucket": "PureStorageBucket",
        "endpoint": "pure.mycorp.net:1234",
        "protocol": "http",
        "enableVirtualAddressing": false
    }
]';

以下示例为这两个存储桶设置 S3BucketCredentials:

=> ALTER SESSION SET S3BucketCredentials='
[
    {
        "bucket": "AWSBucket",
        "accessKey": "<AK0>",
        "secretAccessKey": "<SAK0>",
        "sessionToken": "1234567890"
    },
    {
        "bucket": "PureStorageBucket",
        "accessKey": "<AK1>",
        "secretAccessKey": "<SAK1>"
    }
]';

以下示例设置 STS 临时会话令牌。Vertica 使用会话令牌通过指定凭据访问 S3,并绕过对 USER 存储位置的检查。

$ aws sts get-session-token
  {
    "Credentials": {
        "AccessKeyId": "ASIAJZQNDVS727EHDHOQ",
        "SecretAccessKey": "F+xnpkHbst6UPorlLGj/ilJhO5J2n3Yo7Mp4vYvd",
        "SessionToken": "FQoDYXdzEKv//////////wEaDMWKxakEkCyuDH0UjyKsAe6/3REgW5VbWtpuYyVvSnEK1jzGPHi/jPOPNT7Kd+ftSnD3qdaQ7j28SUW9YYbD50lcXikz/HPlusPuX9sAJJb7w5oiwdg+ZasIS/+ejFgCzLeNE3kDAzLxKKsunvwuo7EhTTyqmlLkLtIWu9zFykzrR+3Tl76X7EUMOaoL31HOYsVEL5d9I9KInF0gE12ZB1yN16MsQVxpSCavOFHQsj/05zbxOQ4o0erY1gU=",
        "Expiration": "2018-07-18T05:56:33Z"
    }
  }

$ vsql
=> ALTER SESSION SET AWSAuth = 'ASIAJZQNDVS727EHDHOQ:F+xnpkHbst6UPorlLGj/ilJhO5J2n3Yo7Mp4vYvd';
=> ALTER SESSION SET AWSSessionToken = 'FQoDYXdzEKv//////////wEaDMWKxakEkCyuDH0UjyKsAe6/3REgW5VbWtpuYyVvSnEK1jzGPHi/jPOPNT7Kd+ftSnD3qdaQ7j28SUW9YYbD50lcXikz/HPlusPuX9sAJJb7w5oiwdg+ZasIS/+ejFgCzLeNE3kDAzLxKKsunvwuo7EhTTyqmlLkLtIWu9zFykzrR+3Tl76X7EUMOaoL31HOYsVEL5d9I9KInF0gE12ZB1yN16MsQVxpSCavOFHQsj/05zbxOQ4o0erY1gU=';

另请参阅

每个存储桶 S3 配置