AmazonCloudWatchイベントがSQS FIFOに対応したようなのでただただツッコんでみただけの話

#はじめに

[Amazon CloudWatch イベントが、Amazon SQS FIFO をイベントターゲットとして追加](
https://aws.amazon.com/jp/about-aws/whats-new/2018/04/amazon-cloudWatch-events-adds-amazon-SQS-FIFO-as-an-event-target/)

```
CloudWatch イベントが Amazon SQS FIFO をサポートするようになり、
イベントをネイティブに SQS FIFO キューにルーティングできるようになりました。
CloudWatch イベントでのターゲットの使用に関する詳細については、
こちらのドキュメントにアクセスしてください。
```

ということなので、
とりあえずS3Putイベントをツッコんでみました。

#SQSを構成する
まずはFIFOキューを作成します。
FIFOは東京リージョンには対応していないのでバージニア北部を使います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164582/da578e17-1c91-2ac2-0312-91665a998d0e.png)
ここではキュー名は「TestQueue.fifo」としておきます。
FIFOの場合はサフィックスに「.fifo」と付けないと怒られて作成できません。


キューの属性で「コンテンツに基づく重複排除」にチェックを入れて、
それ以外はデフォルト値のままにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164582/b1855ee0-c309-51c2-96cf-d83dececc3d0.png)

右下の「キューの作成」ボタンを押すとキューが完成です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164582/9ba06401-01b4-5400-4da3-d93f9591316d.png)


#イベントを発生させるためのバケットを作成します
とりあえずツッコむためにリージョンはバージニア北部に。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164582/f75a47d5-bc87-d269-77b0-b681416933e6.png)

#CloudWatchにルールを作る
CloudWatchイベントでS3Putイベントを拾うようにルールを作ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164582/b457e2f9-6ce0-92ea-4ec0-7cfe34a35aec.png)
警告の通りCloudTrailはObjectPutが拾えるように設定しておきましょう。

そして本命の右側！
ターゲットに作成しておいたFIFOキューを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164582/25c2ce20-aae2-c6a5-950c-6c6e32b6e907.png)

名前は適当に。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164582/16909f70-4133-304c-9f6e-d70cb7830360.png)

作成できました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164582/df429686-2cc6-7885-d813-a30907816f1b.png)

#イベントを発生させてみる
準備が整ったのでイベントをキューにツッコむべく、
バケットにファイルをアップロードしてみます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164582/0ba5dca7-a4b9-10ad-b63d-f77e555156ce.png)

SQSコンソールでキューを表示してみると…
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164582/f50bff0d-bac9-7e8b-036b-0b0102c06f64.png)
入っていました！
SQSを使うこと自体が初めてなのでちょっと感動。

#最後に
過去にLambdaでObjectPutを受けて処理することがありましたが、
スロットリングに悩まされていました。
そのときにこの仕組があればまた違った結果があったかもしれません。
東京リージョンだったんですけど。
SQS FIFOは複数回実行されないことが保証されているので、
イベントを受けるのに相性がいいと思います。
東京に来ていないのが悔やまれますね。

#トラブルシューティング
##FIFOキューにテスト出力できない
キュー作成後にテスト出力しようとしてcliを叩いたけどこのようなエラーメッセージが出るとき

```
>aws sqs send-message --queue-url https://sqs.us-east-1.amazonaws.com/hoghog/TestQueue.fifo --message-group-id "Hellow" --message-body "Hellow FIFO"
An error occurred (AWS.SimpleQueueService.NonExistentQueue) when calling the SendMessage operation: The specified queue does not exist for this wsdl version.
```

queue-urlにリージョンが入っているのにcliのデフォルトリージョンがus-east-1以外になっているのが原因のようです

```
aws configure
```
でキューのあるリージョンを指定すると治ります。

##イベントがキューに入らないんだけど？
cliからキュー作成をしようとして以下のエラーメッセージが出ている場合は、
キューの設定で「コンテンツに基づく重複排除」にチェックが入っていません。

```
>aws sqs send-message --queue-url https://sqs.us-east-1.amazonaws.com/hoghog/TestQueue.fifo --message-group-id "Hellow" --message-body "Hellow
An error occurred (InvalidParameterValue) when calling the SendMessage operation: The queue should either have ContentBasedDeduplication enabled or MessageDeduplicationId provided explicitly
```

イベントを受ける際にMessageDeduplicationIdが渡されてこないからかもしれません。
たぶん。