前回でGmailAPIにアクセスする準備は整いましたので、引き続きLambdaでアクセスしてみたいと思います。

2.Lambdaの設定

① Lambda用プロジェクトの作成

プロジェクトのディレクトリを作成します。また、GmailAPIにアクセス用のライブラリなども利用するためvirtualenvで環境を分けておきます。

mkdir gmailapi_for_lambda
cd gmailapi_for_lambda/
virtualenv .venv

② 秘密鍵をp12からpemに変換

ダウンロードしたp12形式のファイルをpem形式に変換

openssl pkcs12 -in xxxxxxx.p12 -nodes -nocerts > privatekey.pem

③ Lambdaの作成

以下の4つのファイルを準備する。

gmailapi_for_lambda
├── gmail_access.py       ・・・ lambda関数本体
├── lambda.json             ・・・ labda-uploader用設定ファイル
├── privatekey.pem        ・・・ APIアクセス証明書
└── requirements.txt      ・・・ ライブラリリスト

◆gmail_access.py
GmailにアクセスするLambda関数本体となります。

#######################################################################################
# This is a sample to get the message list from Gmail
#######################################################################################
import httplib2
import imaplib,email,email.Header
import base64

from apiclient.discovery import build
from oauth2client.file import Storage
from oauth2client.client import SignedJwtAssertionCredentials
import pprint

def lambda_handler(event, context):
    try:
       main()
    except Exception:
       traceback.print_exc()
       sys.stderr.flush()
       sys.exit(1)

def main():
    pp = pprint.PrettyPrinter(indent=4)

    SERVICE_ACCOUNT_ID="your service account id"     ← サービスアカウントIDをセット
    KEY_SECRET="your secret key"                                 ← 秘密鍵のパスワード
    GMAIL_ACCOUNT="your gmail account"                  ← gmailのアカウント

    f = open("privatekey.pem","rb")
    key = f.read()
    f.close()

    credentials = SignedJwtAssertionCredentials(
        SERVICE_ACCOUNT_ID,
        key,
        scope="https://www.googleapis.com/auth/gmail.readonly",
        sub=GMAIL_ACCOUNT)
    http = httplib2.Http()

    http = credentials.authorize(http)
    service = build("gmail", "v1", http=http)

    message_list = service.users().messages().list(userId='me',
                                                    #labelIds=label_ids,
                                                    #pageToken=page_token,
                                                    maxResults=10,
                                                    q='is:unread'
                                                    ).execute()
    for message in message_list['messages']:
       message_detail = service.users().messages().get(userId='me', id=message['id'],format='metadata').execute()

       for element in message_detail['payload']['headers']:
          if element['name'] == 'Subject':
             print element['value']

if __name__ == '__main__':
        main()

◆lambda.json
lambda-uploder用の設定ファイルとなります。名称は任意です。roleは環境に合わせて変更してください。

{
  "name": "GmailTest",
  "description": "GmailTest",
  "region": "ap-northeast-1",
  "handler": "gmail_access.lambda_handler",
  "role": "arn:aws:iam::000000000000:role/lambda_basic_execution",
  "timeout": 300,
  "memory": 128
}

◆requirements.txt
利用するpythonのライブラリを記載します。Lambdaへのアップロード時にはこのファイルを参照してライブラリがアップロードファイルへ固められます。

pyCrypto
google-api-python-client

virtualenv環境をactive化する

source .py27/bin/activate

pythonライブラリのインストール

pip install -r requirements.txt

lambda-uploaderのインストール

pip install lambda-uploader

lambda-uploaderを実行
事前にaws configrueでアップロード先のアカウントのアクセスキー及びシークレットキーをセットしておく

lambda-uploader

④ 動作確認

Gmailに下記のサンプルデータを準備しました。

20160208230400

アップロードしたLambda関数を選択

20160208230413

ログに取得したメールのタイトルが出力されました。

20160208230426

これでLambdaからGmailにアクセスできるようになりました。同様の方法で他のAPIへのアクセスもできるはずなので、色々と用途が広がりそうです。
gmailのapi-explorerが、Web上で実行できかつコードを生成してくれるのでかなり便利だと思いました。
今回のサンプルはGitHub – cloudfish7/gmailapi_for_lambdaにアップしています。

参考

Python Quickstart | Gmail API | Google Developers
API Reference | Gmail API | Google Developers
Google APIs Explorer

元記事はこちら

AWS LambdaでGmail APIの呼び出し 第2回【cloudpack 大阪 BLOG】