LambdaとAPIGatewayを用いてSlackbotを制作したが,リクエストを送ってもbotに投稿されなかったので解決してみた。
LambdaとAPIGatewayを用いてSlackbotを制作したが,リクエストを送ってもbotに投稿されなかったので解決してみた。:
Cybozuが提供するグループウェアから、期待する従業員データを取得するbotをGoogle Apps Scriptで作成した。しかしGoogle Apps Scriptではいくつかセキュリティにおいて求める状態を達成し辛い一面があった。(あくまで個人の検索内です。)
・契約している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にリダイレクタの機能がないので実現が厳しいという側面もありそう。
まとめると今回自分の情報収集の範囲では、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
(凄くわかりやすかったです。)
Mac OS High Sierra 10.13.6
Garoon SOAP API
AWS Lambda $LATEST
AWS API Gateway
Restlet CRIENT ※一番活用した
まずは全体のうちどこでエラーが起きているかを確認する。
ひとまずLambda関数でのテストで正常な稼働を確認。
これでAPIGatewayとLambda間の通信は問題なさそう。
問題があるとしたら下記。
先にそもそも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はできている様子。
次にAPIGatewayからのレスポンスを確認する。
ここではSlackにメッセージがPOSTされていないので、期待するレスポンスが帰ってきていないと考えたので、Restlet CRIENT を活用する。するとエラーがレスポンスとして帰ってきていることがわかった。
1.forbiddonとInternal server error
https://tmrtmhr.info/tech/aws/502-error-on-api-gateway/**
存在しないURLにPOSTを送っていた。シンプルにURLミス。
APIGateway上でステージを頻繁に更新していた。
ここを揃えてあげるとエラーメッセージが解消された。
2.Missing Authentication Token
1と若干被っている。
公式ドキュメントを参照すると、小リソース(下記だとTestForENvironment)
を
の後に追加してあげると解消された。
4.Unsupported Media Type
マッピングテンプレートの設定をいじって解消した
下記URLを参照!
http://szk416.hatenablog.com/entry/20160903/1472904540
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.6Garoon SOAP API
AWS Lambda $LATEST
AWS API Gateway
Restlet CRIENT ※一番活用した
手順
動作確認
まずは全体のうちどこでエラーが起きているかを確認する。ひとまずLambda関数でのテストで正常な稼働を確認。
これでAPIGatewayとLambda間の通信は問題なさそう。
問題があるとしたら下記。
先にそもそも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はできている様子。
次にAPIGatewayからのレスポンスを確認する。
ここではSlackにメッセージがPOSTされていないので、期待するレスポンスが帰ってきていないと考えたので、Restlet CRIENT を活用する。するとエラーがレスポンスとして帰ってきていることがわかった。
今回帰ってきた主なエラーレスポンスとその解決策
1.forbiddonとInternal server errorhttps://tmrtmhr.info/tech/aws/502-error-on-api-gateway/**
存在しないURLにPOSTを送っていた。シンプルにURLミス。
APIGateway上でステージを頻繁に更新していた。
URL の呼び出し: https://XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev←ここの値が間違っているとこうなる。
ここを揃えてあげるとエラーメッセージが解消された。
2.Missing Authentication Token
1と若干被っている。
公式ドキュメントを参照すると、小リソース(下記だとTestForENvironment)
を
https://XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev
https://XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev/TestForEnvironment
マッピングテンプレートの設定をいじって解消した
下記URLを参照!
http://szk416.hatenablog.com/entry/20160903/1472904540
コメント
コメントを投稿