DynamoDBではテーブルとインデックスのオートスケーリングポリシーを分けることができます。
以前マネージメントコンソール上からはGSIにテーブルと同じオートスケールを適用するという選択肢しかなかったのですがいつのまにかアップデートされてコンソール上からも設定できるようになっていました。
yamlとコンソール上それぞれで設定する方法を記載します。
以前は個別の設定値をコンソール上から確認できなかったので不便でした。この改善はありがたいですね。
yamlでの設定
yamlの記述方法
GSIの作成はTableの中のGlobalSecondaryIndexesで定義できます。
オートスケーリングに関してはスケーリングポリシ(AWS::ApplicationAutoScaling::ScalingPolicy)とスケーリングターゲット(AWS::ApplicationAutoScaling::ScalableTarget)で定義、アタッチします。
コメントアウトしているServiceRoleForDynamoDBの記述はサービスロールが作成されていなければコメントアウトを解除して作成してください。
ServiceRoleForDynamoDB
DynamoDBにオートスケールするための権限を割り振る必要があります。これにはAWSサービスロールを使います。勝手に作成されていることもありますが、存在しない場合は作成する必要があります。
サンプルyamlコード
テーブルとGSIを作成してそれぞれに対してオートスケーリングを設定しているサンプルyamlです。
USERというテーブルを作成してオートスケーリング作成、USER_NAMEというGSIを作成してオートスケーリングを設定しています。コメントアウトしているServiceRoleForDynamoDBの記述はサービスロールが作成されていなければコメントアウトを解除して作成してください。
#AWS CloudFormation スタックを作成のリージョンで作成されます。対象リージョンでスタックを展開してください。
#===============================================================================
# CloudFormation Template
#===============================================================================
AWSTemplateFormatVersion: 2010-09-09
Description: DynamoDB Template
#===============================================================================
# Resources
#===============================================================================
Resources:
#-----------------------------------------------------------
#ServiceLinkedRoleの指定(オートスケールを実施するロールを指定します。マネージドです。)
#ServiceLinkedRoleは通常自動で作成されますが、作成されていない場合はここのコメントアウトを外してください。
#-----------------------------------------------------------
# ServiceRoleForDynamoDB:
# Type: AWS::IAM::ServiceLinkedRole
# Properties:
# AWSServiceName: dynamodb.application-autoscaling.amazonaws.com
# Description: AWS Service Role for application AutoScaling DynamoDBTable
#============================================================
#USERテーブル作成
#============================================================
tableUser:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: "USER"
AttributeDefinitions:
- AttributeName: ID
AttributeType: S
- AttributeName: NAME
AttributeType: S
KeySchema:
- AttributeName: ID
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: '1'
WriteCapacityUnits: '1'
PointInTimeRecoverySpecification:
PointInTimeRecoveryEnabled: false
#============================================================
#インデックス(GSI)の作成
#============================================================
GlobalSecondaryIndexes:
- IndexName: USER_NAME
KeySchema:
- AttributeName: NAME
KeyType: HASH
Projection:
NonKeyAttributes:
- JOB
- OPTION
ProjectionType: INCLUDE
ProvisionedThroughput:
ReadCapacityUnits: '1'
WriteCapacityUnits: '1'
#-----------------------------------------------------------
# テーブルに対してのオートスケーリングターゲット
#-----------------------------------------------------------
UsertableWriteCapacityScalableTarget:
Type: AWS::ApplicationAutoScaling::ScalableTarget
Properties:
MaxCapacity: 100
MinCapacity: 1
ResourceId: !Join
- /
- - table
- !Ref tableUser
RoleARN: !Sub 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable'
ScalableDimension: dynamodb:table:WriteCapacityUnits
ServiceNamespace: dynamodb
UsertableReadCapacityScalableTarget:
Type: AWS::ApplicationAutoScaling::ScalableTarget
Properties:
MaxCapacity: 100
MinCapacity: 1
ResourceId: !Join
- /
- - table
- !Ref tableUser
RoleARN: !Sub 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable'
ScalableDimension: dynamodb:table:ReadCapacityUnits
ServiceNamespace: dynamodb
#-----------------------------------------------------------
# テーブルに対してのオートスケーリングポリシー
#-----------------------------------------------------------
UsertableWriteScalingPolicy:
Type: AWS::ApplicationAutoScaling::ScalingPolicy
Properties:
PolicyName: UsertableWriteAutoScalingPolicy
PolicyType: TargetTrackingScaling
ScalingTargetId: !Ref UsertableWriteCapacityScalableTarget
TargetTrackingScalingPolicyConfiguration:
PredefinedMetricSpecification:
PredefinedMetricType: DynamoDBWriteCapacityUtilization
TargetValue: 70
UsertableReadScalingPolicy:
Type: AWS::ApplicationAutoScaling::ScalingPolicy
Properties:
PolicyName: UsertableReadAutoScalingPolicy
PolicyType: TargetTrackingScaling
ScalingTargetId: !Ref UsertableReadCapacityScalableTarget
TargetTrackingScalingPolicyConfiguration:
PredefinedMetricSpecification:
PredefinedMetricType: DynamoDBReadCapacityUtilization
TargetValue: 70
#-----------------------------------------------------------
# GSIに対してのオートスケーリングターゲット
#-----------------------------------------------------------
UserNameGsiWriteCapacityScalableTarget:
Type: AWS::ApplicationAutoScaling::ScalableTarget
Properties:
MaxCapacity: 20
MinCapacity: 1
ResourceId: !Join
- /
- - table
- !Ref tableUser
- index
- USER_NAME
RoleARN: !Sub 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable'
ScalableDimension: dynamodb:index:WriteCapacityUnits
ServiceNamespace: dynamodb
UserNameGsiReadCapacityScalableTarget:
Type: AWS::ApplicationAutoScaling::ScalableTarget
Properties:
MaxCapacity: 20
MinCapacity: 1
ResourceId: !Join
- /
- - table
- !Ref tableUser
- index
- USER_NAME
RoleARN: !Sub 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable'
ScalableDimension: dynamodb:index:ReadCapacityUnits
ServiceNamespace: dynamodb
#-----------------------------------------------------------
# GSIに対してのオートスケーリングポリシー
#-----------------------------------------------------------
UserNameGsiWriteScalingPolicy:
Type: AWS::ApplicationAutoScaling::ScalingPolicy
Properties:
PolicyName: UsernamegsiWriteAutoScalingPolicy
PolicyType: TargetTrackingScaling
ScalingTargetId: !Ref UserNameGsiWriteCapacityScalableTarget
TargetTrackingScalingPolicyConfiguration:
PredefinedMetricSpecification:
PredefinedMetricType: DynamoDBWriteCapacityUtilization
TargetValue: 90
UserNameGsiReadScalingPolicy:
Type: AWS::ApplicationAutoScaling::ScalingPolicy
Properties:
PolicyName: UsernamegsiReadAutoScalingPolicy
PolicyType: TargetTrackingScaling
ScalingTargetId: !Ref UserNameGsiReadCapacityScalableTarget
TargetTrackingScalingPolicyConfiguration:
PredefinedMetricSpecification:
PredefinedMetricType: DynamoDBReadCapacityUtilization
TargetValue: 90
サンプルyamlデプロイ
こちらをCloudFormationでスタックを作成するとテーブルとGSI、オートスケーリングが作成されます。
デプロイ後DynamoDBのリソースが作成される
マネジメントコンソールからDynamoDBを確認するとインデックスのオートスケーリングとともにテーブルが作成されました。
コンソールからの設定
テーブルは作成してある前提でインデックスの設定を進めます。
インデックスの作成
Dynamodb→テーブル→対象テーブル→インデックスタブでインデックスの作成を押下するとオートスケーリングの設定ができます。
インデックス個別の細かい設定が可能です。
インデックスのキャパシティとオートスケーリングの設定
遷移する画面でインデックスのキャパシティとオートスケーリング設定を行えます。
コンソール上からの設定も以上です。
PR
当ブログはWordPressテーマSWELLを使用しています。非常に使いやすく、簡単にプロのようなデザインを使えるのでお勧めです!!
SWELL – シンプル美と機能性両立を両立させた、圧巻のWordPressテーマ
システムエンジニア
AWSを中心としたクラウド案件に携わっています。
IoTシステムのバックエンド開発、Datadogを用いた監視開発など経験があります。
IT資格マニアでいろいろ取得しています。
AWS認定:SAP, DOP, SAA, DVA, SOA, CLF
Azure認定:AZ-104, AZ-300
ITIL Foundation
Oracle Master Bronze (DBA)
Oracle Master Silver (SQL)
Oracle Java Silver SE
■略歴
理系の大学院を卒業
IT企業に就職
AWSのシステム導入のプロジェクトを担当