まくろぐ

AWS CloudFormation で SNS トピックのリソースを生成する

更新:
作成:

CloudFormation で SNS トピックを作成する

CloudFormation スタック内に SNS トピックを生成するには、CloudFormation テンプレートで AWS::SNS::Topic というタイプのリソースを定義します。

このリソースのプロパティはすべてオプショナル(省略可能)なので、最低限のリソース定義は次のようになります。

template.yml
AWSTemplateFormatVersion: '2010-09-09'

Resources:
  MyTopic:
    Type: AWS::SNS::Topic

トピック名 (Properties.TopicName) すら指定していませんが、その場合は、CloudFormation のスタック名と、トピックの論理 ID(上記の場合は MyTopic)の組み合わせから、自動的にトピック名が割り当てられるようになっています(例: mystack-MyTopic-WMD9B9WWLEXN)。

上記のテンプレートから CloudFormation スタックを生成するには、AWS CLI を使って次のように実行します。

mystack スタックの生成
$ aws cloudformation deploy --stack-name mystack \
    --template-file template.yml \
    --capabilities CAPABILITY_IAM

無事スタックが生成されたら、次のようにして生成された SNS トピックの物理 ID (ARN) を調べることができます。

SNS トピックの ARN を調べる
$ aws cloudformation describe-stack-resources \
    --stack-name mystack \
    --output text \
    --query "StackResources[].PhysicalResourceId"

arn:aws:sns:ap-northeast-1:123456789012:mystack-MyTopic-WMD9B9WWLEXN

Lambda 関数や S3 バケットから SNS トピックに対して publish するときは、この ARN を指定することになります。

SNS トピックの設定いろいろ

トピック名 (TopicName)

トピック名の生成を CloudFormation に任せるのではなく、明示的にトピック名を指定する方法です。

Resources:
  MyTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: topic-hello

上記のように TopicName プロパティを指定すると、SNS トピックの ARN は次のようになります。

arn:aws:sns:ap-northeast-1:123456789012:topic-hello

FIFO トピック (FifoTopic)

FIFO トピックとして作成するには、FifoTopic プロパティを true に設定します。

Resources:
  MyTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: topic-hello.fifo
      FifoTopic: true

FIFO トピックを作るときは、TopicName で明示的に .fifo で終わる名前を付けないと、次のようなエラーになるみたいです。 ほんと AWS はこういうところが分かりにくすぎる。。。

Invalid parameter: Topic Name (Service: AmazonSNS; Status Code: 400; ...

タグ (Tags)

SNS トピックにタグを付けたいときは、Tags プロパティで次のように指定します(他のリソースでタグを設定する場合も同様です)。

Resources:
  MyTopic:
    Type: AWS::SNS::Topic
    Properties:
      Tags:
      - Key: key1
        Value: value1
      - Key: key2
        Value: value2

関連記事

まくろぐ
サイトマップまくへのメッセージ