GoogleドライブのファイルをAWS LambdaでAmazon S3にアップロードする

Pocket

はじめに

こんにちは!山内です。 この前、Googleドライブ(Google Workspace)上のファイルをAmazon S3にアップロードしたいという要件がありました。 最初はGAS(Google Apps Script)で実現しようと思ったのですが、対象となるファイルのサイズがGASの制限値である50MBを超えていたので、結局LambdaでGoogle Drive APIを叩いて実現することにしました。 その時、ちょっとコツが必要だったのでその内容を記事にします!
※画面は2022/03/24 時点のものです。

環境準備

今回はGoogle Drive APIを使うので、まずはGoogle認証周りの環境を準備します。 また、Pythonおよびpipはインストールされている前提です。

Google認証情報の生成

※GCPプロジェクトの作成は他にたくさん記事がありますので割愛します。
  1. GCPのダッシュボードを開く
  2. サイドメニューの「APIとサービス」>「認証情報」をクリック
  3. 「+認証情報を作成」>「OAuthクライアントID」をクリック
  4. 次の項目を入力し、「作成」ボタンをクリック
    • アプリケーションの種類: ウェブアプリケーション
    • 名前         : 任意の名前

  5. 「JSONをダウンロード」をクリックしてから、「OK」をクリック
  6. Google Drive API公式のQuickStart(Python版)のStep1にある下記コマンドを実行

  7. 同ページのStep2にあるPythonファイルを任意のディレクトリに作成(quickstart.py) この時、12行目を下記の通り修正

  8. quickstart.pyと同じディレクトリに手順5でダウンロードしたJSONファイルを「credentials.json」という名前で格納
  9. 下記コマンドでquickstart.pyを実行

  10. デフォルトのブラウザでGoogle認証画面が表示されるので、アクセスしたいGoogleドライブのファイルに対して、アクセス権限を持つGoogleアカウントでログイン
    ※警告が表示された場合は、「詳細を表示」>「[GCPのプロジェクト名](安全ではないページ)に移動」をクリック
  11. アクセス権を確認し、「続行」をクリック
  12. 認証フローが完了したからウィンドウを閉じていいよ、と表示されるのでブラウザウィンドウを閉じる
  13. quickstart.pyと同じディレクトリにtoken.jsonが作成されていることを確認
    ※Pythonの実行ログにて、ログインしたGoogleアカウントのドライブ上のファイルのうち、10件が表示されることを確認できる

AWSリソースの生成

Amazon S3のバケットおよびAWS Lambdaの関数を作成します。 S3にアップロードするので、IAMポリシーの設定は忘れないように! quickstart.pyを利用する際にpip installしたモジュールをLambdaレイヤー化しておくと良いと思います。
※各AWSリソースの作成は他にたくさん記事がありますので割愛します。

S3にアップロードするコードの実装

準備が終わったのでいよいよ、Lambda関数のコードを実装します。 ここまで来ればあっという間です!

 

動作確認

楽しい動作確認の時間です! サンプル用のテキストファイルをGoogleドライブにアップロードしておきました。

Lambdaのテスト実行機能で実行してみます。 実行前のS3は空です。

実行後、ちゃんとファイルがアップロードされてますね!

ダウンロードして中身が壊れていないことも確認できました。

元々の課題だった、50MB以上の大きなファイルもこの通りアップロードできることが確認できます。

 

注意点

やってていくつか注意が必要だと思ったことがあるのでまとめます。

  • 実現したい内容に適したスコープを設定する必要がある (参照:GoogleAPIのOAuth2.0スコープ
  • Googleドライブ上へのファイルへのアクセス権限はGCPプロジェクトのオーナーが持っている必要がある
  • ファイルのサイズが大きい場合はLambdaのメモリを増やす必要がある
特に、1つ目についてはややこしかったので補足しておきます。 例えば、今回利用したスコープでは、「Google ドライブのすべてのファイルを表示およびダウンロード」のみ可能ですが、もし「Google ドライブ内のファイルのメタデータの表示と管理」したい場合は別のスコープを設定する必要があります。その場合は、quickstart.pyとLambdaのコード上にあるSCOPEが「https://www.googleapis.com/auth/drive.metadata」に置き換わります。

 

おわりに

Google認証周りって初見だと結構複雑ですよね。 こういったちょっとしたコードからスタートすると取っつきやすいですし、実際に触ることで理解が深められると思うので、皆さまも是非トライしてみてください!
お問い合わせ先

執筆者プロフィール

Yamauchi Kentaro
Yamauchi Kentarotdi デジタルイノベーション技術部
社内の開発プロジェクトの技術支援や、Javaにおける社内標準フレームワークの開発を担当しています。Spring BootとTDDに手を出しつつ、LINE Botとかもいじったりしています。最近はマイクロサービスを勉強しつつ、クラウドアプリケーションを開発できるエンジニアの育成にも力を入れてます!
Pocket

関連記事