share facebook facebook2 twitter menu hatena pocket slack

2016.04.04 MON

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

河村 敏貴

WRITTEN BY河村 敏貴

前回で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】

河村 敏貴

河村 敏貴

クラウド業界に興味を持ち、業務系のアプリエンジニアからインフラエンジニア見習いに転身しました。日々新しい技術に触れることができる環境でもがきつつも楽しい毎日を過ごしています。 河村 敏貴