Kinesis Data StreamsをCloudFormationで作ってみた

2023.05.19

AWSのフルマネージド型ストリームサービスAmazon Kinesis Data StreamをCloudFormationで作成する機会があったので、テンプレートを共有します。

本記事で紹介するテンプレートでは、Kinesis Dataストリームだけを構築します。ストリームデータを処理するEventBridge Pipes/Lambda等のコンシューマー・パイプライン一式も含めてAWS SAMで構築したい場合は、次の記事を参照ください。

CloudFormation スタック作成方法

  • ストリーム名(KinesisDataStreamName)
  • タグで付与する環境情報(Environment)
    • prd/stg/dev から選択可能

をパラメーターで渡すようにしています。

コンソール

AWS CLI

$ aws cloudformation create-stack \
  --stack-name mystack \
  --template-body file://cfn_kinesis.yaml \
  --parameters \
    ParameterKey=KinesisDataStreamName,ParameterValue=test \ 
    ParameterKey=Environment,ParameterValue=dev

{
    "StackId": "arn:aws:cloudformation:eu-central-1:123456789012:stack/myteststack/e4d49440-f4dd-11ed-900b-061284b8120e"
}

CloudFormationテンプレート

Kinesis Data Streamsは設定項目がごく少数のため、CloudFormationテンプレートもシンプルです。

  • 保存時の暗号化(StreamEncryption)
  • データ保持期間(省略すると24時間)(RetentionPeriodHours)

は要件に合わせてカスタマイズしてください。

残念ながら、シャード単位の拡張モニタリングCloudFormationに対応していないため、ストリーム作成後、ストリーム詳細ページのConfiguration→Enhanced (shard-level) metricsから手動で有効化してください。

  • プロビジョンド(シャード数指定型)
  • オンデマンド(キャパシティオートスケール型)

それぞれのCloudFormationテンプレートを用意しています。

※ 作成されたストリーム

プロビジョンド(シャード数指定型)

プロビジョンド(シャード数指定型)では、シャード数を明示的に指定してキャパシティ管理します。

ShardCount: 1
StreamModeDetails:
  StreamMode: PROVISIONED

cfn_kinesis.yaml

AWSTemplateFormatVersion: "2010-09-09"
Description: Kinesis Data Stream

Parameters:
  KinesisDataStreamName:
    Type: String
  Environment:
    Description: Environment
    Type: String
    Default: dev
    AllowedValues:
      - prd
      - stg
      - dev

Resources:
  KinesisDataStream:
    Type: AWS::Kinesis::Stream
    Properties:
      Name: !Ref KinesisDataStreamName
      RetentionPeriodHours: 24
      ShardCount: 1
      StreamModeDetails:
        StreamMode: PROVISIONED
      StreamEncryption:
        EncryptionType: KMS
        KeyId: alias/aws/kinesis
      Tags:
        - Key: Name
          Value: !Ref KinesisDataStreamName
        - Key: Env
          Value: !Ref Environment

Outputs:
  KinesisDataStream:
    Value: !Ref KinesisDataStream
    Description: Kinesis Data Stream Name

オンデマンド(キャパシティオートスケール型)

オンデマンド(キャパシティオートスケール型)では、キャパシティに応じてオンデマンドでスケールします。

シャード数を指定しない代わりに、StreamMode: ON_DEMAND としています。

cfn_kinesis.yaml

AWSTemplateFormatVersion: "2010-09-09"
Description: Kinesis Data Stream

Parameters:
  KinesisDataStreamName:
    Type: String
  Environment:
    Description: Environment
    Type: String
    Default: dev
    AllowedValues:
      - prd
      - stg
      - dev

Resources:
  KinesisDataStream:
    Type: AWS::Kinesis::Stream
    Properties:
      Name: !Ref KinesisDataStreamName
      RetentionPeriodHours: 24
      StreamModeDetails:
        StreamMode: ON_DEMAND
      StreamEncryption:
        EncryptionType: KMS
        KeyId: alias/aws/kinesis
      Tags:
        - Key: Name
          Value: !Ref KinesisDataStreamName
        - Key: Env
          Value: !Ref Environment

Outputs:
  KinesisDataStream:
    Value: !Ref KinesisDataStream
    Description: Kinesis Data Stream Name
  KinesisDataStreamArn:
    Value: !GetAtt KinesisDataStream.Arn
    Description: Kinesis Data Stream Arn

最後に

Amazon Kinesis Data StreamをCloudFormationで作成する方法を紹介しました。

  • メッセージブローカー
  • プロデューサー
  • コンシューマー

を境界にIaC管理したい場合に利用しやすいかと思います。

現状、CloudFormation単体ではシャード単位のメトリクスを可能にする拡張モニタリングを設定できないため、次のGitHubイシューで改善要望があがっています。

AWS::Kinesis::Stream - EnableEnhancedMonitoring · Issue #768 · aws-cloudformation/cloudformation-coverage-roadmap

同機能がリリースされてから7年も経過している機能のため、そろそろ対応してほしいところです。

それでは。

参考