Kubernetes(EKS)クラスタ上にVaultを構築する際のStorageBackendの選定を検討する中で、「DynamoDB Storage Backend」に関するHashiCorp社の公式Docを読んだので、内容をまとめた上で、設計について軽く考えてみた。
DynamoDB Storage Backend
DynamoDB storage backendは、VaultのデータをDynamoDBテーブルに永続化する為に使用される。
- High Availabirity
- DynamoDBはVaultのHAをサポートする
- DynamoDBはVault Nodeの時間を使って、locksのsession lifetimeを実装するため、Vaultノード間で大幅なクロックスキューが発生すると、ロックで競合の問題を発生させる可能性がある?
- Community Supported
- DynamoDB storage backendは、コミュニティによってサポートされる
- HashiCorp社員によってレビューを受けているが、もしかするとそこまで知識がないかもしれない
- もしこのストレージバックエンドで問題が発生した場合は、元の作者に問い合わせてください
storage "dynamodb" {
ha_enabled = "true"
region = "us-west-2"
table = "vault-data"
}
Required AWS Permissions
VaultがDybamoDBにアクセスする為のIAMポリシーとして、以下のpermissionを含む必要がある。
"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" ]
},
DynamoDB Parameters
- もしVaultの初期化及び実行の前にDynamoDBテーブルを作成する予定ならば、以下の属性をもったテーブルを作成する必要がある。
- Primary partition key:“Path” String
- Primary sort key:“Key” String
- もし既に名前が定義されたテーブルが存在する場合でも、Vaultは変更を加えない。
- Vaultの設定における
read_capacity
とwrite_capacity
は効果がない。
- Vaultの設定における
- もしテーブルがまだ存在いない場合は、Vaultは作成を試みる。
read_capacity
とwrite_capacity
各々に対してread/writeキャパシティの値の設定変更を試みる。- Vaultの利用要件によっては、BillingModeは
PRIVISIONING
ではなくPAY_PER_REQUEST
の方がコストパフォーマンスが高いかもしれない
- DynamoDBのテーブルを明示的にTerraformで作成するか、VaultのConfigに書いて自動的に作らせるか?
- Terraformで書く(タグなど細かい制御が微妙にやりづらいし、バックアップからのリストアなどの柔軟性がなさそうである。
TerraformでDynamoDBを作成
- テーブルに
autoscaling policy
がアタッチされているならば、read_capacity``write_capacity
についてはlifecycle:ignore_changes
を推奨する。
設計考慮ポイント
採用理由
- StorageBackendにVaultを採用する理由は以下のとおり
- AWSマネージドのサービスであり、維持管理コストが低い
- 高い可用性と堅牢性を持っている(Multi-AZに自動的にレプリケーションされている)
- HAをサポートしている
BillingMode
- PRIVISIONINGは秒間あたりのキャパシティを事前に設定し、設定したキャパシティに応じて課金される方式
- PAY_PER_REQUESTは所謂従量課金方式
- Vaultのユースケースを考慮し、従量課金の方がコスパが良いなら従量課金を選択する
バックアップ&リストア
- PITRを使ってバックアップを取得すればよい
- ただし、リストア時にはテーブル名を変更する必要がある
- ただし、これではテーブルの誤削除に耐えられないので、別途オンデマンドバックアップも取る
- AWS Backupで実行できる
VPCエンドポイント
- DynamoDBはGatewayタイプのVPCエンドポイントをサポートする
- (暗号化されたデータが格納されるとはいえ)ネットワークレイヤでのリスク極小化のため、VPCエンドポイント経由でDynamoDBにアクセスしたほうがよい