ようへいの日々精進XP

おっさんの日記です。

2022 年 12 月 27 日 (火)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

最近、Fitbit Charge2 が壊れてしまったので、データが収集出来ていないことに気づきました。アクティビティの表示はしばらくお休みします...

ジョギング

夕飯

里芋のから揚げやら鶏むね肉の野菜炒めやらガッツリと美味しゅうございました。

あっという間の 2022 年

今年も残すところ 4 日ということに気づいた。はやいなー。特に 11 月後半からはあっという間過ぎた。

東那珂 N 日目

ランチに近所の行きつけの回転寿司屋さんに妻と一緒に行った。

genkaimaru.com

ここのおすすめはあら汁。お値段もリーズナブル。そして、いつものように納豆巻きと鉄火巻きでしめた。美味しゅうございました。

2022 年 12 月 26 日 (月)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

最近、Fitbit Charge2 が壊れてしまったので、データが収集出来ていないことに気づきました。アクティビティの表示はしばらくお休みします...

ジョギング

夕飯

ルンミーのから揚げやらお刺身を買ってきて妻と乾杯。美味しゅうございました。

2022 年 12 月 25 日 (日)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

最近、Fitbit Charge2 が壊れてしまったので、データが収集出来ていないことに気づきました。アクティビティの表示はしばらくお休みします...

ジョギング

今日も完全休養。走るモチベーションが落ちてきている。明日は走ろうかな。

夕飯

ツーリングの帰りに香椎のリューイチで担々麺を頂く。美味しゅうございました。

東那珂 N 日目

同僚の森脇さんの納車祝を兼ねて角島までツーリング。昨日までの天気と打って変わって、晴れ間に伸びるの角島大橋は最高だった。川棚温泉で瓦そばを食べたり、自分で計画を立てた割には良い感じでまとまったので良かった。

2022 年 12 月 24 日 (土)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

最近、Fitbit Charge2 が壊れてしまったので、データが収集出来ていないことに気づきました。アクティビティの表示はしばらくお休みします...

ジョギング

今日も完全休養。寒すぎて体を動かせない。終日、椅子に座っていたので右股関節周りに突っ張りがある。。。

夕飯

イカとキャベツとパスタを作った。晩酌に昨晩のハンバーグを頂く。美味しゅうございました。

東那珂 N 日目

終日寒かった。。。ずっと夫婦ふたり、リビングで肩を寄せ合って過ごした。

Google Drive API の Push Notification を利用して Google Drive 上の変更を AWS Lambda で受け取る (試み)

これは

YAMAP エンジニア Advent Calendar 2022 の第 24 日目の記事になる予定です。

qiita.com

経緯

Google Drive の変更をプログラムで受け取れないか調べていたら Google Drive API に Push Notification という機能が提供されていることを知りました。

developers.google.com

この Push Notification (以後、Push 通知) を AWS Lambda の Functions URLs で受け取れるか試してみました。

Google Drive API に Push Notification を理解する

概念図

Push 通知の動作は以下のようなイメージです。

ページトーク

概念図には出てきませんが、ページトークンは Google Drive 全体の変更通知を受け取る際には必要となるパラメータになります。

ページトークンは、Google Drive の変更をどこまで通知しているかを示すマーカーのようなもので、変更一覧を取得リクエストのレスポンスに newStartPageToken が含まれていて、次回、変更一覧を取得する際のリクエストパラメータにセットする必要があります。

チャンネル

チャンネルは、変更通知の送信先 URL (事前に作成する必要がある) をパラメータ (address) の一つとして作成します。今回は、変更通知の送信先 URL を Lambda の Function URL に指定します。

以下、ドキュメントより引用したリクエスト例です。

POST https://www.googleapis.com/drive/v3/changes/watch
Authorization: Bearer auth_token_for_current_user
Content-Type: application/json

{
  "id": "4ba78bf0-6a47-11e2-bcfd-0800200c9a77", // Your channel ID.
  "type": "web_hook",
  "address": "https://mydomain.com/notifications", // Your receiving URL.
  ...
  "token": "target=myApp-myChangesChannelDest", // (Optional) Your channel token.
  "expiration": 1426325213000 // (Optional) Your requested channel expiration time.
}

変更内容の通知

変更内容はリクエストヘッダやリクエストボディに記録されます。

以下、ドキュメントより引用したリクエスト例です。

# ヘッダーに記録されるパターン
POST https://mydomain.com/notifications // Your receiving URL.
Content-Type: application/json; utf-8
Content-Length: 0
X-Goog-Channel-ID: 4ba78bf0-6a47-11e2-bcfd-0800200c9a66
X-Goog-Channel-Token: 398348u3tu83ut8uu38
X-Goog-Channel-Expiration: Tue, 19 Nov 2013 01:13:52 GMT
X-Goog-Resource-ID:  ret08u3rv24htgh289g
X-Goog-Resource-URI: https://www.googleapis.com/drive/v3/files/ret08u3rv24htgh289g
X-Goog-Resource-State:  update
X-Goog-Changed: content,properties
X-Goog-Message-Number: 10

# ボディに記録されるパターン
POST https://mydomain.com/notifications // Your receiving URL.
Content-Type: application/json; utf-8
Content-Length: 118
X-Goog-Channel-ID: 8bd90be9-3a58-3122-ab43-9823188a5b43
X-Goog-Channel-Token: 245t1234tt83trrt333
X-Goog-Channel-Expiration: Tue, 19 Nov 2013 01:13:52 GMT
X-Goog-Resource-ID:  ret987df98743md8g
X-Goog-Resource-URI: https://www.googleapis.com/drive/v3/changes
X-Goog-Resource-State:  changed
X-Goog-Message-Number: 23

{
  "kind": "drive#changes"
}

本題 (変更通知を AWS Lambda で受け取る)

構成

シンプルに下図のような構成を手動で構築しました。

Lambda 関数を作成し、Function URLs を払い出した後に、払い出された URL を利用して、手元の環境から Python スクリプトでチャンネルを作成しています。

コード

一応、チャンネルを作成したり停止するスクリプト (main.py) と Lambda 関数 (handler.py) は、以下のリポジトリにアップしておきました。ちなみに、久しぶりに Python を使ってプログラムを書いてみました。

github.com

以後の実験については、このコードを利用して進めます。

実験

事前の準備

  • Lambda 関数を作成する
    • SSM パラメータストアを利用するので、SSM パラメータストアにアクセス出来る権限を付与する
    • Function URL を払い出しておく
  • SSM パラメータストアにトークンをストア出来るようにする
  • GCP のプロジェクトを作成し、各種設定を行う
    • OAuth の同意画面を作成する
    • OAuth Client ID を払い出す (main.py) で利用する
    • サービスアカウントを払い出す (Lambda 関数) で利用する

チャンネル作成

以下のように main.py を実行してチャンネルを作成します。

$ python main.py create
xxxxxxx-8359-11ed-9dc6-xxxxxxxxxxxxxxxxx # チャンネル ID
xxxxxxxxxxxxxxxxxxxxxxxxxxx # リソース ID

ファイル追加

ファイル (higesan.png) を Google Drive にアップロードしました。

下図のように Lambda 関数にアップロードされたファイル名が記録されました。

ファイル削除

ファイル (higesan.png) を Google Drive から削除してみました。

わかりづらくなったことを反省していますが、削除されたファイル名が記録されました。

ファイルの追加も削除も drive#change になってしまうのが気になりますね。。。

アクセス権の付与や削除

Google Drive 上のとあるフォルダを外部のユーザーに共有してみました。

下図のように通知が飛んできました。どうやら、フォルダやファイルにアクセス権を付与した場合にも通知が飛んできてくれるようです。

チャンネル停止

以下のように main.py を実行してチャンネルを停止します。

$ python main.py ${チャンネル ID} ${リソース ID}

ちなみに、本来であれば、上記を実行することでチャンネルが削除されて通知は止まるはずなんですが、検証でむやみやたらにチャンネルを作ってしまったので、引き続き通知が飛んできてしまう状況です。。。

ということで

Google Drive API の Push 通知を利用して、Google Drive 上の各種変更を AWS Lambda で受け取ってみました。Lambda の Function URL は、ちょっとした Webhook を受け取りたい場合等に便利でした。

尚、Push 通知については、ドキュメント等をちゃんと読み込めていない為、挙動をちゃんと把握しきれてはいませんが、これを利用してやりたいこと (変更が発生したファイルを S3 バケットにバックアップしたり、フォルダやファイルの共有をモニタリング等) が出来そうな気がしましたので、引き続き検証を進めていきたいと思います。

以上、現場からの報告でした。

参考資料

2022 年 12 月 23 日 (金)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

最近、Fitbit Charge2 が壊れてしまったので、データが収集出来ていないことに気づきました。アクティビティの表示はしばらくお休みします...

ジョギング

完全休養。寒すぎて体を動かせない。

夕飯

久しぶりの妻の手作りハンバーグ。新居のガスレンジは火加減が難しいとのことだったけど、安定のおいしさでした。お御馳走様でした。

東那珂 N 日目

朝から雪がチラついていて、寒さに震えながら仕事をしていた。エアコンの設定温度も上げるだけ上げて何とか耐え忍んだ。

2022 年 12 月 22 日 (木)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

最近、Fitbit Charge2 が壊れてしまったので、データが収集出来ていないことに気づきました。アクティビティの表示はしばらくお休みします...

ジョギング

足の痛み。寒すぎて痛いのか、本当に痛いのかよくわからない感じ。

夕飯

久しぶりにヤンニョムチキンを頂きました。美味しゅうございました。

東那珂 N 日目

午後からオフィスでお仕事。行きは冷たい雨に降られて、帰りは吹雪の中を。今年の冬 (も) 厳しくないかい。。。

JAWS-UG 福岡もくもく会 #107

【オンライン開催】 JAWS-UG 福岡 もくもく会 #107 - JAWS-UG九州 | Doorkeeper

に参加した。

2022 年 12 月 22 日 (木)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

最近、Fitbit Charge2 が壊れてしまったので、データが収集出来ていないことに気づきました。アクティビティの表示はしばらくお休みします...

ジョギング

足の痛み。寒すぎて痛いのか、本当に痛いのかよくわからない感じ。

夕飯

久しぶりにヤンニョムチキンを頂きました。美味しゅうございました。

東那珂 N 日目

午後からオフィスでお仕事。行きは冷たい雨に降られて、帰りは吹雪の中を。今年の冬 (も) 厳しくないかい。。。

2022 年 12 月 21 日 (水)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

最近、Fitbit Charge2 が壊れてしまったので、データが収集出来ていないことに気づきました。アクティビティの表示はしばらくお休みします...

ジョギング

ランオフ。いつもの補強。

夕飯

アジの開きやら温野菜等の栄養満点、バランス OK な食事でした美味しゅうございました。

東那珂 N 日目

あまりの寒さにファンヒーターを抱いて仕事していた。福岡の冬は地味に厳しい。

2022 年 12 月 20 日 (火)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

最近、Fitbit Charge2 が壊れてしまったので、データが収集出来ていないことに気づきました。アクティビティの表示はしばらくお休みします...

ジョギング

夕飯

久しぶりに女将お得意のタコニラを作ってもらった。久しぶりだったけど、味は変わっていなくて美味しゅうございました。

東那珂 N 日目

やっとソファのクッションが届いた!

さよなら Y!モバイル

今のバルミューダフォンを入手するにあたって Y!モバイルに MNP したけど、もっと安い MVNO を求めて MNP することにした。MNP 予約番号を取る為に近所の Y!モバイルショップに駆け込んだら、店頭で対応出来ないとのことで、お店の電話を使ってサポートセンターに電話して予約番号を払い出してもらった。店頭が一番早そうだなって思って予約までして店頭に駆け込んだんだけど。。。(笑

お世話になりましたmm