AWS Systems Manager のパラメータストアスループット制限の上限引き上げ (Higher throughput 有効化) の設定を AWS CDK で実装する
こんにちは、製造ビジネステクノロジー部の若槻です。
AWS Systems Manager Parameter Store(以下、Parameter Store)は、アプリケーションの設定データや機密情報を安全に保存および管理するためのサービスです。Standard tier の場合は無料で利用できるため、活用している方も多いのではないでしょうか。
さて、Parameter Store の API には当然ながらサービスクォータによるスループット制限がありますが、デフォルト(Standard Throughput)ではさほど高くありません。制限を緩和したい場合はスループットの上限引き上げ(Higher throughput 有効化) の設定をする必要があります。
Higher Throughput を有効化することにより、下記のように API ごとのスループットを向上させることができ、中でも読み取り系 API のスループットが大幅に向上するため、多数のパラメーターストアからの読み取りが必要なユースケースにおいて有効です。
API アクション | Standard Throughput | Higher Throughput |
---|---|---|
GetParameter | 40(※) | 10,000 |
GetParameters | 40(※) | 1,000 |
GetParametersByPath | 40(※) | 100 |
DeleteParameter | 3 | 5 |
DeleteParameters | 3 | 5 |
DescribeParameters | 3 | 10 |
GetParameterHistory | 3 | 10 |
LabelParameterVersion | 3 | 10 |
UnlabelParameterVersion | 3 | 10 |
PutParameter | 3 | 10 |
※上限値は 3 API で共用
ちなみに Higher Throughput 有効化時は、下記のように Standard tier のパラメーター利用に対しても API インタラクション数に応じた課金が発生するため、注意が必要です。
パラメータータイプ | Pricing - Standard Throughput | Pricing - Higher Throughput |
---|---|---|
Standard tier | 追加料金なし | API インタラクション 1 万回ごとに 0.05 USD |
Advanced tier | API インタラクション 1 万回ごとに 0.05 USD | API インタラクション 1 万回ごとに 0.05 USD |
今回は、AWS Systems Manager のパラメータストアスループット制限の上限引き上げ (Higher throughput 有効化) を AWS CDK で実装してみました。
やってみた
CDK 実装
結論として、Higher Throughput 有効化は次のようにカスタムリソースを使う必要がありました。
import * as cdk from "aws-cdk-lib";
import * as cr from "aws-cdk-lib/custom-resources";
import * as iam from "aws-cdk-lib/aws-iam";
import { Construct } from "constructs";
export class ParameterStoreConstruct extends Construct {
constructor(scope: Construct, id: string) {
super(scope, id);
/**
* Parameter Store のスループット設定の ARN
*/
const highThroughputEnabledArn = cdk.Stack.of(this).formatArn({
service: "ssm",
resource: "servicesetting",
resourceName: "ssm/parameter-store/high-throughput-enabled",
});
/**
* カスタムリソース用の IAM ロール
* - Lambda の実行ロール
* - SSM のサービス設定を更新する権限
*/
const customResourceRole = new iam.Role(this, "HighThroughputEnabledRole", {
assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"),
managedPolicies: [
iam.ManagedPolicy.fromAwsManagedPolicyName(
"service-role/AWSLambdaBasicExecutionRole"
),
],
inlinePolicies: {
ParameterStoreServiceSettingPolicy: new iam.PolicyDocument({
statements: [
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: ["ssm:UpdateServiceSetting", "ssm:ResetServiceSetting"],
resources: [highThroughputEnabledArn],
}),
],
}),
},
});
/**
* Parameter Store のスループットを設定するカスタムリソース
* - 作成時に Higher throughput を有効化
* - 削除時に Higher throughput を無効化(デフォルトにリセット)
*/
new cr.AwsCustomResource(this, "ThroughputSetting", {
onCreate: {
service: "SSM",
action: "updateServiceSetting",
parameters: {
SettingId: highThroughputEnabledArn,
SettingValue: "true",
},
physicalResourceId: cr.PhysicalResourceId.of(
"parameter-store-throughput-setting"
),
},
onDelete: {
service: "SSM",
action: "resetServiceSetting",
parameters: {
SettingId: highThroughputEnabledArn,
},
physicalResourceId: cr.PhysicalResourceId.of(
"parameter-store-throughput-setting"
),
},
role: customResourceRole, // IAM ロールを明示的に定義することにより、Lambda の実行ロールの権限を必要最低限に抑える
policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE,
}),
});
}
}
Higher throughput の有効化および無効化を行うための API 仕様は下記で確認が可能です。
動作確認
デプロイ前
前述の CDK 実装をデプロイする前に、Parameter Store のスループット設定がデフォルト(Standard Throughput)であることを確認します。
Parameter Store のコンソールで設定メニューを見ると、ボタンが 上限をセットする
となっています。これはデフォルトの Standard Throughput の状態です。
サービスクォータのコンソールでも Parameter Store の各種 API のスループットがデフォルト値であることが確認できます。
作成デプロイ
前述の CDK 実装をデプロイして、カスタムリソースの onCreate
の実行により Higher throughput を有効化してみます。
デプロイ後にコンソールで設定メニューを見ると、ボタンが 上限をリセットする
に変わっています。
また、サービスクォータのコンソールでも Parameter Store の各種 API のスループットが Higher throughput の値に変わっていることが確認できます。
これで Higher throughput の有効化ができていることが確認できました。
削除デプロイ
続いて、コンストラクト削除のデプロイをして、onDelete が実行され、 Higher throughput を無効化してみます。
デプロイ後にコンソールで設定メニューを見ると、ボタンが 上限をセットする
に戻っています。
サービスクォータもデフォルト値に戻っていますね。
Higher throughput の無効化もできていることが確認できました。
注意点
Higher throughput の有効化のデプロイ後に、Parameter Store のコンソールで設定メニューではボタンが 上限をリセットする
に変わっていましたが、サービスクォータのコンソールでは各種 API のスループットが下記のようにデフォルト値のままのことがありました。
ドキュメントを見ると下記のようにあったため、コンソール上の表示に反映されるまでに時間がかかる場合があるようです。
通常、更新は Service Quotas にすぐに表示されます。まれに、更新が反映されるまでに最大 24 時間かかることがあります。
この時は Higher throughput の有効化と無効化を何回か試していた時でした。サービスクォータの更新自体のクォータもあるのかも知れませんね。
以上