🌊
23.ElastiCache ServerlessをCloudFormationで動かしてみる試み
0.やりたいこと
- ElastiCache ServerlessをCloudFormationで立てたい
1.必要設定項目の確認
マネジメントコンソールを確認
-
Topページから
Redis OSS キャッシュを作成
-
名前だけ入力すれば作成できそう
-
デフォルト設定を開いてみる
-
デフォルト設定をカスタマイズにするとこんな感じ
AWS CloudFormationのUser Guide
- プロパティをテーブルにしてみる
プロパティ名 | 説明 | 必須かどうか | タイプ | 更新時の影響 |
---|---|---|---|---|
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円
- 為替を150円/$として
-
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円
- 為替を150円/$として
-
東京リージョンだと
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.参考
Discussion