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_capacitywrite_capacityは効果がない。
  • もしテーブルがまだ存在いない場合は、Vaultは作成を試みる。
    • read_capacitywrite_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にアクセスしたほうがよい