这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

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 配置

1 - 每个存储桶 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": ""
    },
]';