🌊

23.ElastiCache ServerlessをCloudFormationで動かしてみる試み

2024/08/17に公開

0.やりたいこと

  • ElastiCache ServerlessをCloudFormationで立てたい

1.必要設定項目の確認

マネジメントコンソールを確認

  • Topページから Redis OSS キャッシュを作成

  • 名前だけ入力すれば作成できそう

  • デフォルト設定を開いてみる

  • デフォルト設定をカスタマイズにするとこんな感じ

AWS CloudFormationのUser Guide

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-serverlesscache.html

  • プロパティをテーブルにしてみる
プロパティ名 説明 必須かどうか タイプ 更新時の影響
CacheUsageLimits サーバーレスキャッシュの使用制限。 No CacheUsageLimits 影響なし
DailySnapshotTime 毎日のキャッシュスナップショット作成時間。 No 文字列 (String) 影響なし
Description サーバーレスキャッシュの説明。 No 文字列 (String) 影響なし
Endpoint キャッシュノードへの接続に必要な情報。読み取り専用。 No Endpoint 影響なし
Engine 互換性のあるエンジン。 Yes 文字列 (String) 置換が必要
FinalSnapshotName 削除前に取得される最終スナップショットの名前。 No 文字列 (String) 影響なし
KmsKeyId データ保存に使用されるAWS KMSキーのID。 No 文字列 (String) 置換が必要
MajorEngineVersion 互換性のあるエンジンバージョン番号。 No 文字列 (String) 置換が必要
ReaderEndpoint キャッシュノードへの接続に必要な情報。読み取り専用。 No Endpoint 影響なし
SecurityGroupIds 関連するEC2セキュリティグループのID。 No 文字列 (String)の配列 影響なし
ServerlessCacheName サーバーレスキャッシュの一意識別子。 Yes 文字列 (String) 置換が必要
SnapshotArnsToRestore スナップショットからのデータ復元用ARN。 No 文字列 (String)の配列 置換が必要
SnapshotRetentionLimit スナップショット保持数設定。 No 整数 (Integer) 影響なし
SubnetIds サブネットIDが指定されていない場合、デフォルトのサブネットが選択される。 No 文字列 (String)の配列 置換が必要
Tags 追加されるタグのリスト。 No Tag の配列 影響なし
UserGroupId 関連するユーザーグループの識別子。 No 文字列 (String) 影響なし

CacheUsageLimits

プロパティ名 説明 データ型 必須 更新時の影響
DataStorage キャッシュの最大データストレージ容量(ギガバイト単位) DataStorage No 影響なし
ECPUPerSecond キャッシュが1秒間に消費できるElastiCache Processing Units (ECPU) の数 ECPUPerSecond No 影響なし
  • DataStoregeとECPUPerSecondについてはUser Guide上明記していないが、マネージメントコンソール上に値の範囲の記載あり
    プロパティ名 単位 最小 最大
    DataStorage GB 1 5,000
    ECPUPerSecond ECPU 1,000 15,000,000

DataStorage

プロパティ名 説明 データ型 必須 更新時の影響
Maximum キャッシュが使用できるデータストレージの上限 Integer No 影響なし
Minimum キャッシュが使用できるデータストレージの下限 Integer No 影響なし
Unit ストレージの測定単位(GB) String Yes 影響なし

ECPUPerSecond

プロパティ名 説明 データ型 必須 更新時の影響
Maximum キャッシュが1秒間に消費できるECPUの上限 Integer No 影響なし
Minimum キャッシュが1秒間に消費できるECPUの下限 Integer No 影響なし

Endpoint

プロパティ名 説明 必須かどうか タイプ 更新時の影響
Address クライアントが接続するエンドポイントのアドレス。この値は読み取り専用です。 No 文字列 (String) 影響なし
Port クライアントが接続するエンドポイントのポート。この値は読み取り専用です。 No 整数 (Integer) 影響なし

2.CloudFormationから作成

elasticache_serverless.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: CloudFormation template for creating an AWS ElastiCache Serverless Redis.

Resources:
  # VPC for ElastiCache
  ElastiCacheVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Stack
          Value: elasticache_serverless

  # Subnets for ElastiCache
  ElastiCacheSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Select [0, !GetAZs ]
      CidrBlock: 10.0.1.0/24
      VpcId: !Ref ElastiCacheVPC
      Tags:
        - Key: Stack
          Value: elasticache_serverless

  ElastiCacheSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Select [1, !GetAZs ]
      CidrBlock: 10.0.2.0/24
      VpcId: !Ref ElastiCacheVPC
      Tags:
        - Key: Stack
          Value: elasticache_serverless

  # Security Group for ElastiCache
  ElastiCacheSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: "Security group for ElastiCache"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 6379
          ToPort: 6379
          CidrIp: 0.0.0.0/0 # Replace with a more restrictive CIDR range if necessary
      VpcId: !Ref ElastiCacheVPC
      Tags:
        - Key: Stack
          Value: elasticache_serverless

  ElastiCacheServerless:
    Type: AWS::ElastiCache::ServerlessCache
    Properties:
      CacheUsageLimits: 
        DataStorage: 
          Maximum: 1
          Unit: GB
        ECPUPerSecond: 
          Maximum: 1000
      Description: desc
      Engine: redis
      MajorEngineVersion: 7
      SecurityGroupIds: 
        - !Ref ElastiCacheSecurityGroup
      ServerlessCacheName: redis-svl-cfn
      SubnetIds:
        - !Ref ElastiCacheSubnet1
        - !Ref ElastiCacheSubnet2
      Tags: 
        - Key: Stack
          Value: elasticache_serverless

stackの作成

$ aws cloudformation create-stack \
  --profile <my-profile> \
  --stack-name ElastiCacheServerless \
  --template-body file://elasticache_serverless.yaml

3.後片付け

$ aws cloudformation delete-stack \
  --profile <my-profile> \
  --stack-name ElastiCacheServerless \

4.料金

https://calculator.aws/#/createCalculator/ElastiCache

データストレージ料金 + ECPU 料金 で出せる

  • リージョンは東京
  • データストレージ料金だけ入れてみる(最低が1GBなので1からしか入力できない)

  • 最小のデータストレージ料金だけで110.23 USD

    • 為替を150円/$として 110.23 x 150 = 16,534.5円
  • ECPUも入れてみる

    • 平均シンプルリクエストレート(秒)を100
    • リクエストごとに転送された平均データ量 [KB]を10とした時
    • 10.7748 USD
    • 為替を150円/$として 10.7748 x 150 = 1,616.22円

合計月額コスト

  • 110.23 USD (データストレージ) + 10.7748 USD (ECPU) = 121.0048 USD (ElastiCache サーバーレスの合計コスト)
  • 為替を150円/$として 121.0048 x 150 = 18,150.72円

5.気になったこと

  • データストレージ料金はストレージを1GBも使わなくても発生するのかどうか

検証

  • 1時間程度何もしないで放置してみる

結果

  • $0.24

    • 為替を150円/$として 0.24 x 150 = 36円
  • 東京リージョンだとUSD 0.151 / GB-hourなのでおおよそ金額感合致

素朴な疑問

  • データストレージをMaximum: 1にしていたから1GB分の料金だった?
  • とすると、Maximum: 2にすれば2GB分の料金になる?
DataStorage: 
          Maximum: 1

追加検証

  • DataStorageを2にした時に、何もしなくても2GBの料金が発生するかどうか
DataStorage: 
-          Maximum: 1
+          Maximum: 2
  • 作成は東京リージョンだと少し高いので バージニア北部 で作成
    • バージニア北部だとUSD 0.125 / GB-hour

スタックの作成

$ aws cloudformation create-stack \
  --profile <my-profile> \
  --region us-east-1 \
  --stack-name ElastiCacheServerless \
  --template-body file://elasticache_serverless.yaml

推測

  • 何もしなくてもMaximum分のコストが発生する
  • つまり、1時間程度放置して USD 0.125 x 2 = USD 0.25 の金額感になる想定

確認

$ aws elasticache describe-serverless-caches \
  --profile <my-profile> \
  --region us-east-1 \
  | jq .ServerlessCaches.[].CacheUsageLimits.DataStorage
{
  "Maximum": 2,
  "Unit": "GB"
}

削除

  • 小一時間したら削除
$ aws cloudformation delete-stack \
  --profile <my-profile> \
  --region us-east-1 \
  --stack-name ElastiCacheServerless

結果

  • この結果だけを見ると1GB分の利用料しかかかっていないので、もしかするとMinimum1GBはデフォルトで発生するけど、そこからは段階的に1GB毎の従量課金のような体系になっているのかなんなのか

6.まとめ

  • データストレージ料金はMaximumで設定した時間あたりの金額、ストレージを実際に使わなくてもコストは発生する

6.参考

https://dev.classmethod.jp/articles/create-elasticache-serverless-with-cfn-cli/

https://aws.amazon.com/jp/elasticache/pricing/?nc=sn&loc=5

https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/red-ug/WhatIs.html

Discussion