紙一重の積み重ね

アラフォーのエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。

【AWS】CloudFormationでSQS(FIFOキュー)を生成するスタック

f:id:yokoyantech:20200121135425p:plain

はじめに

CloudFormationではじめてAWS SQSを作成したのでメモ。

作成するキュー

  • アプリのメール送信処理を非同期化したい
    • 先入れ先出しを採用
  • dev環境、staging環境、production環境毎にキューを分ける
  • Shoryuken workerからキューイングする想定
    • ロングポーリング

作成したスタック

AWSTemplateFormatVersion: 2010-09-09
Description: 'Create SQS for ENV'
# --------------------------------------------- #
# 画面に表示するパラメータ
# --------------------------------------------- #
Metadata:
  "AWS::CloudFormation::Interface":
    ParameterGroups:
      - Label:
          default: "input your environment(dev or staging or production)"
        Parameters:
          - ENV

# --------------------------------------------- #
# Input Parameters
# --------------------------------------------- #
Parameters:
  ENV:
    Type: String
    Default: "dev"

Resources:
  # ----------------------------------------------------- #
  # SQS Settings
  # ----------------------------------------------------- #
  DevelopmentFIFOQueue:
    Type: AWS::SQS::Queue
    Properties:
      # FIFOキューの重複排除を有効化
      ContentBasedDeduplication: true
      # メッセージ配信遅延時間(秒) => Default 0秒
      DelaySeconds: 0
      # 先入れ先出しキューを生成
      FifoQueue: true
      # メッセージの最大バイト数 => Default 262144B(256KB)
      MaximumMessageSize: 262144
      # SQSのメッセージ保持秒数 => Default 4日
      MessageRetentionPeriod: 345600
      QueueName: !Sub ${ENV}-myapp-mail.fifo
      # workerの負荷を抑えるためにロングポーリングにする => 最大20秒
      ReceiveMessageWaitTimeSeconds: 20
      Tags:
        - 
          Key: Name
          Value: !Sub ${ENV}-myapp-mail.fifo
      # キューからメッセージ配信された後にメッセージを利用できなくなる時間の長さ(秒) => Default 30秒
      VisibilityTimeout: 30

  SqsQaueuePolicy:
    Type: AWS::SQS::QueuePolicy
    Properties:
      PolicyDocument:
        Id: !Ref DevelopmentFIFOQueue
        Version: '2012-10-17'
        Statement:
          - Sid: Allow-User-SendMessage
            Effect: Allow
            # dev環境はすべてのユーザにアクセス権限を付与する
            # TODO: SQS API用のIAMユーザを作成して、指定する
            # https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-basic-examples-of-sqs-policies.html
            Principal: "*"
            Action: "sqs:*"
            Resource:
              !GetAtt DevelopmentFIFOQueue.Arn
      # ポリシー追加先のキューURL
      Queues:
        - !Ref DevelopmentFIFOQueue

# --------------------------------------------- #
# Output Parameters
# --------------------------------------------- #
# 他のスタックからパラメータ参照するためにOutputsで定義する
Outputs:
  QueueName:
    Value: 
      !GetAtt DevelopmentFIFOQueue.QueueName
    Export:
      Name: !Sub ${ENV}-myapp-mail-queue-name
  QueueArn:
    Value: 
      !GetAtt DevelopmentFIFOQueue.Arn
    Export:
      Name: !Sub ${ENV}-myapp-mail-queue-arn