DynamoDB 存储后端
DynamoDB 存储后端可以用来将 Vault 的数据保存到 DynamoDB 表中。
- 支持高可用集群 —— DynamoDB 存储后端支持高可用集群。由于 DynamoDB 使用 Vault 节点上的时间来实现锁的会话生命周期,所以 Vault 节点之间显著的时钟偏差可能会导致锁上的争用问题。
- 仅有社区支持 —— DynamoDB 存储后端由社区支持。虽然它已经过 HashiCorp 员工的审查,但他们可能对该技术并不了解。如果遇到问题,该问题可能会被转交给原作者。
storage "dynamodb" {
ha_enabled = "true"
region = "us-west-2"
table = "vault-data"
}
更多关于 DynamoDB 表的读写权限的信息,请参阅 AWS DynamoDB 官方文档。
DynamoDB 参数
endpoint
(string: "")
– 指定一个非默认的,兼容 AWS 规范的 DynamoDB 端点。该参数也可以通过设置环境变量AWS_DYNAMODB_ENDPOINT
来设置。(可用来配置使用兼容 DynamoDB 协议的其他存储服务)ha_enabled
(string: "false")
– 配置该后端是否被用以运行在 Vault 高可用模式下。可选参数为true
或是false
。该参数也可以通过设置环境变量DYNAMODB_HA_ENABLED
来设置。max_parallel
(string: "128")
– 设置最大并行请求数。region
(string "us-east-1")
– 设置 AWS region。该参数也可以通过设置环境变量AWS_DEFAULT_REGION
来设置。read_capacity
(int: 5)
– 设置表上每秒可以执行多少次读操作,该参数在 Vault 创建 DynamoDB 表时生效,如果table
已经存在则不起作用。该参数也可以通过设置环境变量AWS_DYNAMODB_READ_CAPACITY
来设置。table
(string: "vault-dynamodb-backend")
– 设置用来存储 Vault 数据的 DynamoDB 表名称。如果指定的表并不存在,那么在初始化时会创建该表。该参数也可以通过设置环境变量AWS_DYNAMODB_TABLE
来设置。请阅读下方表结构 获取表结构信息。write_capacity
(int: 5)
– 设置表上每秒可以执行多少次写操作,该参数在 Vault 创建 DynamoDB 表时生效,如果table
已经存在则不起作用。该参数也可以通过设置环境变量AWS_DYNAMODB_WRITE_CAPACITY
来设置。
下列参数用于向 AWS 进行身份验证。如果您在 EC2 实例上运行 Vault 服务器,您还可以使用 EC2 实例配置文件服务来提供 Vault 用于调用 DynamoDB API 的凭据。将 access_key
和 secret_key
字段留空将导致 Vault 尝试从 AWS 元数据服务检索凭证。
access_key
(string: <required>)
– 设置 AWS access key。该参数也可以通过设置环境变量AWS_ACCESS_KEY_ID
来设置。secret_key
(string: <required>)
– 设置 AWS secret key。该参数也可以通过设置环境变量AWS_SECRET_ACCESS_KEY
来设置。session_token
(string: "")
– 设置 AWS session token。该参数也可以通过设置环境变量AWS_SESSION_TOKEN
来设置。
必要的 AWS 权限
Vault 所使用的 IAM 用户或是 EC2 实例配置文件所拥有的策略必须包含以下权限以使 Vault 可以顺利地对 DynamDB 表执行必要的操作:
"Statement": [
{
"Action": [
"dynamodb:DescribeLimits",
"dynamodb:DescribeTimeToLive",
"dynamodb:ListTagsOfResource",
"dynamodb:DescribeReservedCapacityOfferings",
"dynamodb:DescribeReservedCapacity",
"dynamodb:ListTables",
"dynamodb:BatchGetItem",
"dynamodb:BatchWriteItem",
"dynamodb:CreateTable",
"dynamodb:DeleteItem",
"dynamodb:GetItem",
"dynamodb:GetRecords",
"dynamodb:PutItem",
"dynamodb:Query",
"dynamodb:UpdateItem",
"dynamodb:Scan",
"dynamodb:DescribeTable"
],
"Effect": "Allow",
"Resource": [ "arn:aws:dynamodb:us-east-1:... dynamodb table ARN" ]
},
表结构
如果要在 Vault 初始化之前预先创建 DynamoDB 表,我们需要创建包含以下属性(attribute)的表:
- 主分区键(Primary partition key): "Path",string 类型
- 主排序键(Primary sort key):"Key",string 类型
我们可以用 Terraform 来创建这样的表:
resource "aws_dynamodb_table" "dynamodb-table" {
name = "${var.dynamoTable}"
read_capacity = 1
write_capacity = 1
hash_key = "Path"
range_key = "Key"
attribute = [
{
name = "Path"
type = "S"
},
{
name = "Key"
type = "S"
}
]
tags {
Name = "vault-dynamodb-table"
Environment = "prod"
}
}
如果要创建的表已经存在,那么 Vault 不会修改它 —— Vault 配置文件中的 read_capacity
和 write_capacity
值将不生效。
如果要创建的表尚不存在,Vault 会尝试创建它,并且分别应用Vault 配置文件中的 read_capacity
和 write_capacity
值。
AWS 读取实例元数据超时
影响 Vault 1.4 及以后的版本
Vault 在 EC2 实例上使用实例元数据服务的时候,例如从实例配置文件中获取凭据,使用到实例元数据服务 (IMDSv2) 的 v2 版本时可能会出现延迟。 Vault 使用的 AWS SDK 首先尝试连接到 IMDSv2,如果超时,则回退到 v1。在 Vault 1.4 中,此超时最多可能需要 2 分钟。在 Vault 1.5.5 及更高版本中最多可能需要 2 秒钟。
超时会发生在 Vault 和 IMDSv2 之间存在代理,并且实例 hop 限制设置为小于 Vault 和 IMDSv2 之间的“hop”数的时候。例如,如果 Vault 在 EC2 实例上的 docker 中运行,并且实例 hop 限制设置为 1,AWS SDK 客户端将尝试连接到 IMDSv2,超时并回退到 IMDSv1,因为 docker 和 IMDS 之间存在额外的网络 hop.
为避免超时行为,可以在底层 EC2 实例上调整 hop 限制。对于 docker 示例,将 hop 限制设置为 2 就可以让 Vault 中的 AWS SDK 无延迟地连接到 IMDSv2。
Vault 配置使用 DynamoDB 的例子
使用自定义的表读写限制
该例子演示了使用自定义的读/写能力配置创建表:
storage "dynamodb" {
table = "my-vault-data"
read_capacity = 10
write_capacity = 15
}
启用高可用
该例子演示了为 DynamoDB 存储后端启用高可用:
api_addr = "https://vault-leader.my-company.internal"
storage "dynamodb" {
ha_enabled = "true"
...
}