Amazon MSKクラスターをCloudFormationで作成してみた

2022.03.03

いわさです。

MSKでCloudFormationにて作成出来るリソースの範囲が広がりました。
しかし、そもそもCloudFormationで作成する記事がなかったので本日はベーシックなMSKクラスターを作成してみました。

動作確認用のKafkaクライアント(EC2)も作成します。

テンプレート

以下のリポジトリにテンプレートはおいておきます。

クラスター作成

おそらく最小構成のクラスターです。
ブローカーインスタンスは2以上にする必要があります。

MSKクラスターの作成は時間がかかります。15~20分ほど。

  MSKCluster:
    Type: 'AWS::MSK::Cluster'
    Properties:
      BrokerNodeGroupInfo:
        ClientSubnets:
          - !Ref PrivateSubnetOne
          - !Ref PrivateSubnetTwo
        InstanceType: !Ref BrokerInstanceType
        SecurityGroups:
          - !Ref MSKSecurityGroup
        StorageInfo:
          EBSStorageInfo:
            VolumeSize: !Ref BrokerStorageSize
      ClusterName: HogeCluster
      KafkaVersion: 2.6.2
      EncryptionInfo:
        EncryptionInTransit:
          ClientBroker: TLS
          InCluster: true
      NumberOfBrokerNodes: !Ref BrokerNum

クライアント作成

EC2クライアントはユーザーデータでKafkaクライアントをセットアップしています。
ユーザーデーター付近だけ抜粋します。

MSKのCloudFromationにクライアント実装のサンプルがあり、そちらをベースに少し記述方法を変更したりしています。

  KafkaClientEC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      InstanceType: t3.small
      KeyName: !Ref KeyPairVM
      IamInstanceProfile: !Ref EC2InstanceProfile
      SubnetId: !Ref PrivateSubnetOne
      ImageId: !Ref ClientAMI
      UserData:
        Fn::Base64: |
          #cloud-config
          package_update: true
          package_upgrade: true
          runcmd:
          - amazon-linux-extras enable corretto8
          - yum update -y 
          - yum install python3.7 -y
          - yum install java-1.8.0-amazon-corretto -y
          - yum erase awscli -y
          - cd /home/ec2-user
          - echo "export PATH=.local/bin:$PATH" >> .bash_profile
          - mkdir kafka
          - mkdir mm
          - cd kafka
          - wget https://archive.apache.org/dist/kafka/2.6.2/kafka_2.12-2.6.2.tgz
          - tar -xzf kafka_2.12-2.6.2.tgz
          - cd /home/ec2-user
          - wget https://bootstrap.pypa.io/get-pip.py
          - su -c "python3.7 get-pip.py --user" -s /bin/sh ec2-user
          - su -c "/home/ec2-user/.local/bin/pip3 install boto3 --user" -s /bin/sh ec2-user
          - su -c "/home/ec2-user/.local/bin/pip3 install awscli --user" -s /bin/sh ec2-user
          - chown -R ec2-user ./kafka
          - chgrp -R ec2-user ./kafka
          - chown -R ec2-user ./mm
          - chgrp -R ec2-user ./mm

スタック作成

スタック作成後はMSKクラスターが作成されます。

また、EC2はMSKクライアントをセットアップ済みなので、すぐにトピックへの送信を試すことが可能になっています。

sh-4.2$ sudo su ec2-user
[ec2-user@ip-172-31-36-114 bin]$ cd ~/kafka/kafka_2.12-2.6.2/bin

[ec2-user@ip-172-31-41-236 bin]$ vi client.properties
[ec2-user@ip-172-31-41-236 bin]$ ./kafka-console-producer.sh --broker-list b-1.hogecluster.mss7x7.c3.kafka.ap-northeast-1.amazonaws.com:9094,b-2.hogecluster.mss7x7.c3.kafka.ap-northeast-1.amazonaws.com:9094 --producer.config client.properties --topic HogeTopic
>aaa
bbb
ccc
ddd
eee

さいごに

クライアントとクラスターのテンプレートを用意しておいて、作成と削除をすぐ出来るようにしておくと、MSKの動作をちょっと確認したいときなどに便利です。
今後MSKを検証するときは、このテンプレートを使おうと思います。