【サンプルyamlあり】DynamoDBでテーブルとインデックスのオートスケールを作成する

DynamoDBアイキャッチ

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、オートスケーリングが作成されます。
CloudFormationでスタックを生成した画面
図1CloudFormationでスタック作成

デプロイ後DynamoDBのリソースが作成される

マネジメントコンソールからDynamoDBを確認するとインデックスのオートスケーリングとともにテーブルが作成されました。

CloudFormationスタック更新後、DynamoDBリソースが作成されたことを確認する画面
図2テーブルとGSIが作成された(各々AutoScalling付)

コンソールからの設定

テーブルは作成してある前提でインデックスの設定を進めます。

インデックスの作成

Dynamodb→テーブル→対象テーブル→インデックスタブインデックスの作成を押下するとオートスケーリングの設定ができます。
インデックス個別の細かい設定が可能です。

マネジメントコンソールでインデックスを作成する
図3マネジメントコンソールからGSIの作成

インデックスのキャパシティとオートスケーリングの設定

遷移する画面でインデックスのキャパシティとオートスケーリング設定を行えます。

インデックスキャパシティーの設定画面
図4マネジメントコンソールからGSIのオートスケーリングの設定

コンソール上からの設定も以上です。

PR
当ブログはWordPressテーマSWELLを使用しています。非常に使いやすく、簡単にプロのようなデザインを使えるのでお勧めです!!

SWELL – シンプル美と機能性両立を両立させた、圧巻のWordPressテーマ

ランキング

ランキングに参加しています。クリックして応援いただけると嬉しいです。
にほんブログ村 IT技術ブログ クラウドコンピューティングへ
にほんブログ村
AWSランキング
AWSランキング

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次