AWS LambdaでGoogleDriveのファイルを操作する

IT・プログラミング

今回は AWS のLambdaから、Google ドライブ上のファイルを操作する方法を紹介します。
今回のポイントとしては、AWS で外部のライブラリーを使う場合の使い方を合わせて知ることができます。
標準ライブラリーを使ったり AWS が準備しているレイヤーに存在する ライブラリーを使う場合は 比較的簡単に実行できますが、外部ライブラリーを使いたいといったような場合にどうしていいかわからないケースがあると思います。
そのような場合の参考にもなればと思います。
Google の API を使ったGoogle ドライブの操作方法については、以前の記事で紹介しているので、API の使い方 等についてはそちらを参照してください。

AWS Lambda の基本的な使い方についても以前紹介しているのでそちらも合わせて確認してください。

関数の作成

まずは AWS にログインをし、Lambdaを検索します。
Lambdaの画面に移動すると関数を作成というボタンがあるのでそちらをクリックします。
関数の設定は以下のように行います。
1から作成を選択し、自由に関数名を入力します。
ランタイムは Python を選択しておきます。
関数作成

ZIP ファイルの作成

通常であれば作成後のコードエディターを使って、コードを入力する場合が多いと思います。しかし、外部のライブラリーを使いたいような場合には、
1. ライブラリーを含めたファイル群を作成し ZIP ファイルとしてアップロードする
2. レイヤーを作成する
という2つのやり方があります。
今回はライブラリを含めた ZIP ファイルを作成する方法で行います。

必要なライブラリーなどの準備については、ローカル環境やGoogleColab、Cloud9などで可能です。Python のバージョンなどをしっかりと合わせて行いたい場合には、同じ AWS サービスのCloud9が簡単です。
あまりバージョンに依存しないような内容の場合には、GoogleColabが手軽です。今回は、GoogleColabを使います。

アップロードしたいフォルダを作成し、その中に必要なライブラリーをインストールしていきます。

lamda_function.pyの中に、前回も紹介した、GoogleDriveのファイルを操作するプログラムを書いておきます。

認証情報のファイル(credentials.json)もドラッグ&ドロップなどで、フォルダー内に追加してください。

追加したら最後にzipにします。
一連のこの流れのコードは以下になります。

import os
import shutil

# 作業ディレクトリを作成
if not os.path.exists('lambda_package'):
    os.makedirs('lambda_package')

# 必要なライブラリをインストール
!pip install -t lambda_package google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client

# Lambda関数のコードを作成
lambda_code = """
import json
import os
import csv
from google.oauth2 import service_account
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload

SCOPES = ['https://www.googleapis.com/auth/drive.file']
SERVICE_ACCOUNT_FILE = 'credentials.json'

def upload_file_to_drive(file_path, folder_id):
    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    service = build('drive', 'v3', credentials=credentials)

    file_metadata = {
        'name': os.path.basename(file_path),
        'parents': [folder_id]
    }
    media = MediaFileUpload(file_path, mimetype='text/csv')
    file = service.files().create(
        body=file_metadata,
        media_body=media,
        fields='id'
    ).execute()
    return file.get('id')

def read_csv_from_drive(file_id):
    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    service = build('drive', 'v3', credentials=credentials)

    request = service.files().get_media(fileId=file_id)
    csv_data = request.execute()
    return csv_data.decode('utf-8').splitlines()

def lambda_handler(event, context):
    file_path = '/tmp/sample.csv'  # Lambdaで一時ファイルとして保存
    folder_id = 'YOUR_GOOGLE_DRIVE_FOLDER_ID'

    # CSVファイルを作成
    with open(file_path, 'w', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(['Name', 'Age', 'City'])
        writer.writerow(['John', '23', 'New York'])
        writer.writerow(['Anna', '30', 'San Francisco'])

    # ファイルをGoogle Driveにアップロード
    file_id = upload_file_to_drive(file_path, folder_id)

    # アップロードしたCSVファイルを読み取る
    csv_lines = read_csv_from_drive(file_id)

    # CSV内容を表示(Lambdaのログに出力)
    for line in csv_lines:
        print(line)

    return {
        'statusCode': 200,
        'body': json.dumps('CSVファイルをアップロードし、読み取りました')
    }
"""

# Lambda関数のコードをファイルに保存
with open('lambda_package/lambda_function.py', 'w') as f:
    f.write(lambda_code)

# credentials.jsonファイルをアップロード
from google.colab import files
uploaded = files.upload()

# credentials.jsonを作業ディレクトリに移動
shutil.move(list(uploaded.keys())[0], 'lambda_package/credentials.json')

# zipファイルを作成
shutil.make_archive('lambda_function', 'zip', 'lambda_package')

実行後にセッションの再起動を求められる場合がありますが、無視して問題ありません。

ダウンロードした ZIP ファイルを、AWS のコード画面のアップロード 元をクリックして、zipを選択して、アップロードします。
アップロード
容量が大きい場合には、コードの編集画面は表示されませんが、実行そのものは可能です。
表示
テストの実行を行うなどして、実際にファイルがアップロードできたり、読み込んだりできることを確認してください。
テスト

今回のコードはこちらのGoogle Colabで確認できます。

タイトルとURLをコピーしました