【CloudFormation/SAM】SQSのポリシーをインポートする【Tips】

記事タイトルとURLをコピーする

サービス開発部兼ドラクエ部のくればやしです。

今月末の5月27日に「ドラゴンクエスト」シリーズは誕生40周年を迎えるようです。色々発表があるようなので、今から楽しみです😀

はじめに

前回の記事では、API Gateway(REST API)をAWS::Serverless::Api としてインポートする方法を解説しました。

blog.serverworks.co.jp

本記事では、SQSのポリシーをCloudFormationのスタックにインポートする方法を解説します。

インポートの方法

インポートのための工程として、最初にテンプレートファイルを準備することとなると思います。 おそらく、素直に準備すると以下のようなテンプレートファイルを準備することとなると思います。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: SAM template migrated from Serverless Framework (sqs1)

Resources:
  MyQueue:
    Type: AWS::SQS::Queue
    DeletionPolicy: Retain

  MyQueuePolicy:
    Type: AWS::SQS::QueuePolicy
    DeletionPolicy: Retain
    Properties:
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: "sqs:SendMessage"
            Resource: "*"
            Principal: "*"
      Queues: [
        !Ref MyQueue
      ]

しかし、上記のテンプレートファイルをインポートしようとすると、CloudFormationで以下のエラーが発生します。

ResourceTypes [AWS::SQS::QueuePolicy] are not supported for Import

CloudFormation ではすべてのリソースがインポートに対応しているわけではありません。 以下ドキュメントを確認しても、 AWS::SQS::QueuePolicy は記載がなく、インポートには対応していないと分かります。

docs.aws.amazon.com

上記ドキュメントを確認すると、似たリソースで AWS::SQS::QueueInlinePolicy というリソースがあるのが分かります。 こちらの仕様を確認すると、 AWS::SQS::QueuePolicy は紐づけできるキューを複数指定できるのに対して、 AWS::SQS::QueueInlinePolicy の方は必ず一つのキューのみと紐づけすることとなっています。

こちらのリソースは、先程のドキュメントでインポート対応を確認できたので、試してみたところ、問題なくインポートできました

CFnテンプレートファイル

  MyQueueKure:
    Type: AWS::SQS::Queue

  MyQueuePolicy:
    Type: AWS::SQS::QueueInlinePolicy
    Properties:
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: "sqs:SendMessage"
            Resource: "*"
            Principal: "*"
      Queue: !Ref MyQueueKure

リソース紐付けファイルのファイル

[
  {
    "ResourceType": "AWS::SQS::QueueInlinePolicy",
    "LogicalResourceId": "MyQueuePolicy",
    "ResourceIdentifier": {
      "Queue": "https://sqs.us-east-1.amazonaws.com/xxxxxxx/xxxxxxxxxxx"
    }
  }
]

最終的なテンプレートファイルのリソースを AWS::SQS::QueuePolicy で作成したい場合は、インポートではなく、既存リソースと同じポリシーを書いたテンプレートファイルでスタックをデプロイする必要があるようです。 その場合は、CloudFormationの変更セット上は、ポリシーは Add されるような変更内容が表示されますが、デプロイ処理自体は問題無く動作し、ポリシーの変更は実質無くテンプレートと同期することが可能になります。

まとめ

  • スタックにSQSのポリシーをインポートする場合は AWS::SQS::QueueInlinePolicy を使う
  • 既存のポリシーを AWS::SQS::QueuePolicy としてスタックで管理する場合は、同じポリシーを設定したテンプレートファイルでデプロイする

おわりに

以上、CloudFormationインポートのTipsの一つをご紹介しました。どなたかの一助になれば幸いです。

紅林輝(くればやしあきら)(サービス開発部) 記事一覧

サービス開発部所属。2015年にサーバーワークスにJOIN。クラウドインテグレーション部を経て、現在はCloud Automatorの開発に従事。ドラクエ部。推しナンバーはⅤ、推しモンスターはクックルー。