ぴろログ

Output Driven

モーニングコールが欲しくって。- API Gateway / Lambda 編 -

作業メモなのでざっくりと。

やりたいこと

CloudWatch(イベント)でモーニングコールの時刻設定を行い、Lambdaを自動実行することでAmazon Connectで電話をかけさせる。 動作パターンは4種類。

  1. モーニングコールの時刻確認 S3上のHTMLファイル(JavaScript)にアクセス
    →APIGateway経由でLambda①を実行
    →CloudWatch-Events①の値(cron)を取得して返す
  2. モーニングコールの時刻変更
    S3上のHTMLファイル(JavaScript)で時刻設定、PUT
    →APIGateway経由でLambda②を実行
    →CloudWatch-Events①の値(cron)を変更
  3. モーニングコール
    CloudWatch-Events①がトリガとなって
    →Lambda③が実行され
    →Amzon Connectの問い合わせフローが流れる
  4. 次回モーニングコールのキャンセル
    DashButtonをクリック
    →IoT 1-Clickを経由して
    →Lambda⑤を実行

  5. Lambda
    ① 設定時刻(CloudWatchのルール)の参照用
    ② 設定時刻(CloudWatchのルール)の変更用
    ③ CloudWatchをトリガとしてAmazon Connectをキック ←これで電話がかかる
    ④ 次回のコールをキャンセル(下記のCloudWatch①をdisable化)
    ⑤ CloudWatch①をenable化

  6. CloudWatch-Events イベント の「ルール」に以下2つの設定を作成。
    ① Lambda③をターゲットとするルール
    ② Lambda⑤をターゲットとするルール
  7. Amazon Connect
    事前に電話番号の取得や問い合わせフロー(電話をかけた後のアクション)を作成済み。

作業メモ

LambdaやHTML(python)はコードはGitHubにあげるので割愛。ポイントだけ。

Lambda + APIGateway

  • CORS対応
      • CORS(Cross-Origin Resource Sharing):オリジン間リソース共有
      • 今回のケースだと、S3に保存したHTMLファイル(https://s3.amazonaws.com/xxx~)のJavascriptによって、APIGateway(https//< MCS用ドメイン > ~)経由でCloudWatch Eventsの情報を取得・Webブラウザ上に表示する。
      • 以下の設定を行った。
        • Lambda側 レスポンスのヘッダに「Access-Control-Allow-Origin」
    return {
    …
    'statusCode': 200,
    <span style="color: #ff0000;"><strong>'headers': {'Access-Control-Allow-Origin': '*'}</strong><span style="color: #000000;">,</span></span>
    'body': json.dumps(response)
    }
      • APIGateway側 「統合リクエスト」で「Lambda Proxy Integration」を選択。 これを有効にすることで、クライアントからのリクエストをいい感じに整理して後続のLambdaに渡してくれる。 (参考) https://qiita.com/_mogaming/items/2bd83204e212e35b2c6c
      • 後々で気づいたが、Lambdaでレスポンスヘッダを記述するのではなく、APIGateway側で「CORSの有効化」をクリックしちゃえばそれで良かった。。次はこれで試そう。

APIGateway

  • コール時刻(cron)の取得、変更のリソースを作成。変更用(/setSchedule)の方も横着してGETメソッドで。
  • CloudFormationによるスタック再作成時のAPIGatewayエンドポイント(URL)変更を吸収するために、カスタムドメインを設定。

感想

  • APIGateway
    • HTTPプロキシ機能が便利。昔は細かく設定する必要があって大変だったらしいが、今はボタンぽちーで完了。
    • エンドポイントは1つにして、メソッドによって裏のLambdaを変える構成にしたい。
    • APIキー」による認証機能の追加も、いずれ。