WebSocket - AWSのサンプルで API Gateway を使ったchatアプリを作ろうとしたらハマった件

## はじめに

「[[発表]Amazon API GatewayでWebsocketが利用可能 - AWS](https://aws.amazon.com/jp/blogs/news/announcing-websocket-apis-in-amazon-api-gateway/)」と「[【新機能】APIGatewayでWebSocketが利用可能になったのでチャットAPIを構築してみた - Qiita](https://qiita.com/G-awa/items/472bc1a9d46178f3d7a4)」を参考にして、API Gateway を使用したチャットを作成しようとしたら思わぬところでハマったので、解決したときのメモです。

## APIGateway で実現する WebSocket

「[[発表]Amazon API GatewayでWebsocketが利用可能 - AWS](https://aws.amazon.com/jp/blogs/news/announcing-websocket-apis-in-amazon-api-gateway/)」にある通り、2018年12月19日に Amazon API Gateway で WebSocket 通信を実現出来るようになりました。

AWS ではこの機能を使用した簡単なチャットアプリを「[simple-websockets-chat-app - Serverless](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:729047367331:applications~simple-websockets-chat-app)」や「[aws-samples/simple-websockets-chat-app - GitHub](https://github.com/aws-samples/simple-websockets-chat-app)」で公開しています。

このサンプルアプリは以下のような構成で実装されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/b86ad28e-10ae-a143-1868-75d6dac184a3.png)

このコードの解説は、「[【新機能】APIGatewayでWebSocketが利用可能になったのでチャットAPIを構築してみた - Qiita](https://qiita.com/G-awa/items/472bc1a9d46178f3d7a4)」という記事で詳細に解説されています。

- [simple-websockets-chat-app - Serverless](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:729047367331:applications~simple-websockets-chat-app)
- [aws-samples/simple-websockets-chat-app - GitHub](https://github.com/aws-samples/simple-websockets-chat-app)

## メッセージが正しく送れない問題

記事を見ると、AWSが公開しているコードをそのままデプロイすれば問題なく動作しているようでしたが、自分がやってみると正しく送ることが出来ませんでした。

Lambda のデバッグログを確認しながら見てみると、 `sendMessage` の処理をしている箇所でエラーを吐いているようでした。

ここで、`sendMessage`の Lambda 関数に設定された IAM Role の設定状況を見てみると、以下のように、`execute-api:ManageConnections` が正しく設定されていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/624bc31b-3a54-00c8-9944-c0cddb12fb73.png)

AWSの記事を見ると、確かに設定が必要と記載がありますが、マネジメントコンソール上では「一致するアクションが見つかりません」となってしまいます。

> 接続されたクライアントに呼び出しを行うには、アプリケーションに新しいアクセス権 “execute-api：ManageConnections”が必要です。 これは、AWS SAMテンプレートで処理されます。
cf. [[発表]Amazon API GatewayでWebsocketが利用可能 - AWS](https://aws.amazon.com/jp/blogs/news/announcing-websocket-apis-in-amazon-api-gateway/)

ここで、`execute-api` にアクションとして設定出来る選択肢の一覧を探したのですが、以下の記事では `InvalidateCache` と `Invoke` の2つしか記載がありませんした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/6d7fc1a8-45fd-6264-b211-5471954eaca8.png)
cf. [Actions, Resources, and Condition Keys for Amazon API Gateway - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/list_amazonapigateway.html#amazonapigateway-execute-api-general)

## 対策

現状では、以下の図のように「すべての ExecuteAPI アクション」を指定することで、期待する動きを確認することが出来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79222/faed0138-2acc-c202-b149-e6c937220056.png)


ドキュメントのアップデートが遅れることはあると思うので、`execute-api:ManageConnections` が設定出来ないのは日本のリージョンだけなのかもしれませんが、思わぬところでハマってしまいました。

## 参考

### APIGatway

- [Amazon API Gateway とは? - Amazon API Gateway](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/welcome.html)

### IAM

- [ポリシー概要 (サービスの一覧) - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_understand-policy-summary.html)

### execute-api

- [API 実行アクセス権限の IAM ポリシーの例 - Amazon API Gateway](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-iam-policy-examples-for-api-execution.html)
- [API を呼び出すためのアクセスの制御 - Amazon API Gateway](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html)
- [IAM アクセス権限により API へのアクセスを制御する - Amazon API Gateway](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/permissions.html)
- [IAM ユーザー認証の使用 - Amazon API Gateway](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-websocket-control-access-iam.html)
- [Actions, Resources, and Condition Keys for Amazon API Gateway - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/list_amazonapigateway.html#amazonapigateway-execute-api-general)
- [AWS Lambda Websockets - Medium](https://medium.com/@chrissullivan.dev/aws-lambda-websockets-9f10f667154f)
- [API Gateway での REST API へのアクセスの制御と管理 - Amazon API Gateway](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-control-access-to-api.html)