前回で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に下記のサンプルデータを準備しました。
アップロードしたLambda関数を選択
ログに取得したメールのタイトルが出力されました。
これで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