LambdaとAPIGatewayを用いてSlackbotを制作したが,リクエストを送ってもbotに投稿されなかったので解決してみた。

LambdaとAPIGatewayを用いてSlackbotを制作したが,リクエストを送ってもbotに投稿されなかったので解決してみた。:


LambdaとAPIGatewayを用いてSlackbotを制作したが,リクエストを送ってもbotに投稿されなかったので解決してみた。


何を目的に、何をしたのか。(達成できてない場合は「できてません」も冒頭で)


Google Apps Scriptでの課題を発見→AWSへリプレイスした

Cybozuが提供するグループウェアから、期待する従業員データを取得するbotをGoogle Apps Scriptで作成した。しかしGoogle Apps Scriptではいくつかセキュリティにおいて求める状態を達成し辛い一面があった。(あくまで個人の検索内です。)


アクセス制限が柔軟ではないGAS

・契約しているGsuite下のアカウントでGASプロジェクトを作成した場合、同じドメインを持っているgoogleアカウントしかプロジェクトにアクセスできないため、外部のクライアント(ここではSlack.comをドメインにもつSlack)がプロジェクトにアクセスできず、パラメータをGASに渡すことができない。下記は同様の課題を取り上げているリンク。(GCPを経由して管理者権限で許可するドメインを設定できるとほんのり書いてある記事もあったがググっても該当するテーマには出会えず、、、)

https://support.google.com/a/answer/60781
https://teratail.com/questions/151593
https://stackoverflow.com/questions/50276491/google-apps-script-web-app-with-variable-user-permissions

・逆にGsuite下にないgoogleアカウントでGASプロジェクトを作成した場合、GASプロジェクトへのアクセス権が3種類しか存在せず、外部のクライアントからアクセスを受け入れる場合はその他のクライアントも全て受け入れる必要がある。Slackからのアクセスは受け入れ可能だが,エンドポイントが流出した場合社内の従業員情報を公開してしまう危険がある。

・クライアントとしてOAuthトークンを扱う記事は多いが、今回のように特定のユーザーのみがGASプロジェクトにアクセスできるように、GASからクライアントにトークンを発行して渡すという記事が見えない。Slackにリダイレクタの機能がないので実現が厳しいという側面もありそう。


GASでのアクセス制限まとめ

まとめると今回自分の情報収集の範囲では、Gsuiteのアカウント下・または通常のGoogleアカウントで作成したGASプロジェクトに対して、外部の特定のクライアントにのみアクセスを許可し、それ以外はアクセス制限をかけるという仕様を実現するのは難しいという結論に達した。


次のアーキテクチャに求める要件

そのためbotを作成する上でいくつか要件を定義した。

★エンドポイントが流しても問題ないように、ユーザー・ドメイン・IPアドレス単位でアクセスを許可する(ホワイトリスト・ブラックリストが柔軟)

★エンドポイントが非公開である(GASも別に非公開ではない)

色々ググった中でAWSがHITした。決め手になったのは下記のページである。
https://dev.classmethod.jp/cloud/aws/api-gateway-resource-policy/

以上目的として開発を進めていく。


問題

下記の記事をメインにググりつつLambdaとAPIGateway、Slackを構築したのだが、Slackからトリガーになるメッセージを投稿したときに反応がなかった。
https://qiita.com/exabugs/items/e868df55333d0805acb2

(凄くわかりやすかったです。)


結論やわかったこと


やったこと


準備(OSのバージョン・環境等)

Mac OS High Sierra 10.13.6

Garoon SOAP API

AWS Lambda $LATEST

AWS API Gateway
Restlet CRIENT ※一番活用した


手順


動作確認

まずは全体のうちどこでエラーが起きているかを確認する。

ひとまずLambda関数でのテストで正常な稼働を確認。
image.png

これでAPIGatewayとLambda間の通信は問題なさそう。

問題があるとしたら下記。


image.png


先にそもそもAPIGatewayに対してSlackからPOSTできているかどうかを確認する。

そのためAPIGatewayのログを参照。(ここはポリシーを付与すれば簡単にみれる。下記を参照)
https://dev.classmethod.jp/server-side/serverless/aws-reinvent2017-api-gateway-access-log/

記事内のCloudWatchグループ名の生成でハマったとき参考にした記事が下記。

命名規則が書いてあるので参考にするといい。
https://www.yamamanx.com/api-gateway-cloudwatch-accesslog/

これでログの参照可能になる。するとSlackからのPOSTはできている様子。

image.png

次にAPIGatewayからのレスポンスを確認する。


image.png


ここではSlackにメッセージがPOSTされていないので、期待するレスポンスが帰ってきていないと考えたので、Restlet CRIENT を活用する。するとエラーがレスポンスとして帰ってきていることがわかった。


今回帰ってきた主なエラーレスポンスとその解決策

1.forbiddonとInternal server error
https://tmrtmhr.info/tech/aws/502-error-on-api-gateway/**

存在しないURLにPOSTを送っていた。シンプルにURLミス。

APIGateway上でステージを頻繁に更新していた。

URL の呼び出し: https://XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev←ここの値が間違っているとこうなる。 


image.png


ここを揃えてあげるとエラーメッセージが解消された。

2.Missing Authentication Token

1と若干被っている。

公式ドキュメントを参照すると、小リソース(下記だとTestForENvironment)


image.png




https://XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev 
の後に追加してあげると解消された。

https://XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev/TestForEnvironment 
4.Unsupported Media Type

マッピングテンプレートの設定をいじって解消した

下記URLを参照!
http://szk416.hatenablog.com/entry/20160903/1472904540

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)