PR

ローカル環境から AWS へ!Gmail スケジュール連携ツール移行ガイド – 第1段階|AWS環境の準備手順【Gmail×Googleカレンダー自動化】

モニタにPythonコードが表示され、AWSのロゴとGmail、Google Calendarのアイコンが配置されたイメージ。サーバーレス移行と連携処理の概念を示す。 働き方とIT活用
AWS LambdaによるGmail連携スケジュール管理のサーバーレス化イメージ

こんにちは!このブログでは、ローカル環境で動作している Gmail と Google スケジュールを連携するツールを、より強力で信頼性の高い AWS (Amazon Web Services) 環境へと移行する手順を段階的にご紹介していきます。

前回の記事は↓

第1段階となる今回は、AWS でツールを動かすための土台となるサービス、AWS Lambda、AWS Secrets Manager、Amazon EventBridge の基本的な設定について解説します。これらのサービスを理解し、適切に設定することで、移行の第一歩をしっかりと踏み出しましょう。

1. AWS Lambda の準備 – サーバーレスコンピューティングの世界へようこそ

1.1. Lambda とは? その魅力

AWS Lambda は、「サーバーレスコンピューティングサービス」と呼ばれるものです。なんだか難しそうに聞こえますが、簡単に言うと、サーバーの管理を一切気にすることなく、コードを実行できる便利なサービスです。

これまでの開発では、自分でサーバーを用意し、OS の設定やソフトウェアのインストール、セキュリティ対策など、多くの管理作業が必要でした。しかし、Lambda を使えば、これらの面倒な作業から解放され、書いたコードに集中できるのです。

Lambda の主な魅力は以下の通りです。

  • サーバーレス: サーバーの構築や管理は AWS にお任せ。インフラの心配は不要です。
  • 従量課金: 実際にコードが実行された時間と回数に応じて料金が発生します。使わないときは費用がかかりません。
  • 自動スケーリング: アクセスが増えても、AWS が自動的に処理能力を調整してくれます。
  • イベント駆動: さまざまな AWS のサービスや外部からのリクエストに応じてコードを実行できます。

1.2. AWS マネジメントコンソールでの Lambda 関数の作成

それでは、実際に Lambda 関数を作成してみましょう。AWS マネジメントコンソールにログインし、Lambda のサービス画面を開いてください。

  1. 画面右上のリージョンが、お住まいの地域に近いリージョン(例: 東京なら「アジアパシフィック (東京)」)になっていることを確認します。
  2. 左側のメニューから「関数」を選択し、「関数の作成」ボタンをクリックします。
  3. 関数の作成方法を選択する画面が表示されます。ここでは「一から作成」を選択します。
  4. 以下の項目を入力していきます。
    • 関数名: 任意のわかりやすい名前を入力します。(例: gmail-calendar-sync
    • ランタイム: 実行するプログラミング言語を選択します。今回は Python を使用しますので、最新の安定版(例: Python 3.12)を選択してください。
    • アーキテクチャ: 通常はデフォルトの x86_64 で問題ありません。
    • アクセス許可: 「基本的な Lambda のアクセス許可でロールを作成」を選択します。後ほど、必要に応じてこのロールに権限を追加します。
  5. その他の項目はデフォルトのままで構いません。「関数の作成」ボタンをクリックします。

これで、基本的な Lambda 関数が作成されました。まだコードは記述していませんが、AWS 上で Python コードを実行するための準備が整いました。

1.3. IAM ロールの重要性と権限の設定

先ほど作成した Lambda 関数には、「IAM ロール」というものが自動的に割り当てられています。IAM (Identity and Access Management) ロールは、AWS のサービスが他のサービスにアクセスするための権限を定義するものです。

今回のツールでは、Lambda 関数が以下の操作を行う必要があります。

  • AWS Secrets Manager から認証情報を読み取る権限
  • CloudWatch Logs にログを書き込む権限 (これはデフォルトで付与されています)

現時点では Secrets Manager へのアクセス権限がないため、後ほどこのロールに権限を追加する必要があります。IAM の設定は少し複雑に感じるかもしれませんが、AWS のサービス同士が安全に連携するために非常に重要な仕組みです。

1.4. Lambda 関数の環境変数の設定

Lambda 関数が Secrets Manager からシークレットを読み取る際に、どのシークレットを参照すべきかを指定するために、環境変数を使用します。環境変数は、Lambda 関数の実行環境に設定できるキーと値のペアで、コード内で簡単にアクセスできます。

  1. 作成した Lambda 関数の画面を開き、「設定」タブを選択します。
  2. 左側のメニューから「環境変数」を選択します。
  3. 「編集」ボタンをクリックします。
  4. 「環境変数を追加」ボタンをクリックし、以下のキーと値を入力します。
    • キー: SECRET_NAME
    • 値: Secrets Manager で作成したシークレットの名前(例: gmail-calendar-credentials
  5. 「保存」ボタンをクリックします。

これで、Lambda 関数は実行時に SECRET_NAME という環境変数を参照することで、Secrets Manager の正しいシークレットにアクセスできるようになります。

1.5. Lambda 関数のタイムアウト設定の変更

Lambda 関数には、デフォルトで3秒のタイムアウト設定がされています。これは、関数が実行を開始してから指定された時間を超えると、強制的に処理が中断される設定です。Gmail への接続やメールの取得処理には、3秒では短い場合があります。そのため、タイムアウト時間をより適切な値(例えば30秒以上)に延長することを推奨します。

  1. 作成した Lambda 関数の画面を開き、「設定」タブを選択します。
  2. 左側のメニューから「一般設定」を選択します。
  3. 「編集」ボタンをクリックします。
  4. 「タイムアウト」の項目に、希望するタイムアウト時間を秒単位で入力します。(例: 30
  5. 「保存」ボタンをクリックします。

Lambda 関数の最大タイムアウト時間は 900秒 (15分) です。処理の内容に合わせて適切なタイムアウト時間を設定してください。

2. AWS Secrets Manager の設定 – 大切な認証情報を安全に管理

2.1. Secrets Manager とは? なぜ必要?

AWS Secrets Manager は、データベースの認証情報、API キー、その他の機密情報を安全に保管し、管理、取得できるサービスです。

ローカル環境でツールを開発していた際、Gmail のパスワードや Google Calendar のリフレッシュトークンなどをコードの中に直接記述したり、環境変数に保存したりしていたかもしれません。しかし、これらの方法はセキュリティ上のリスクがあります。

Secrets Manager を利用することで、これらの機密情報を暗号化して安全に保管し、必要な時に Lambda 関数からセキュアに取得することができます。

2.2. Secrets Manager でシークレットを作成

それでは、実際に Secrets Manager で Gmail と Google Calendar の認証情報を保管するためのシークレットを作成しましょう。

  1. AWS マネジメントコンソールで Secrets Manager のサービス画面を開きます。
  2. 画面右上のリージョンが Lambda 関数と同じリージョンになっていることを確認します。
  3. 「新しいシークレットを保存する」ボタンをクリックします。
  4. シークレットのタイプを選択する画面が表示されます。ここでは「その他のタイプのシークレット」を選択します。
  5. 「キー/値のペアを追加」セクションで、以下のキーと値を入力していきます。
    • キー: gmail_address値: あなたの Gmail のメールアドレス
    • キー: gmail_password値: あなたの Gmail のパスワード
    • キー: garoon_sender、値: Garoon からのスケジュール通知メールの送信元メールアドレス
    • キー: google_refresh_token、値: Google Calendar API のリフレッシュトークン(取得方法は別途解説します)
    • キー: google_client_id、値: Google Cloud Platform で作成した OAuth 2.0 クライアント ID
    • キー: google_client_secret、値: Google Cloud Platform で作成した OAuth 2.0 クライアント シークレット
  6. それぞれのキーに対応する値を正確に入力してください。
  7. 「次へ」をクリックします。
  8. シークレット名を入力します。わかりやすい名前(例: gmail-calendar-credentials)を付けて、「次へ」をクリックします。
  9. ローテーションの設定は今回はスキップして、「次へ」をクリックします。
  10. 設定内容を確認し、「保存」をクリックします。

これで、必要な認証情報が Secrets Manager に安全に保管されました。

2.3. Lambda 関数への Secrets Manager アクセス権限の付与

次に、作成した Lambda 関数が Secrets Manager にアクセスして、保存した認証情報を読み取れるように権限を付与します。

  1. AWS マネジメントコンソールで IAM のサービス画面を開きます。
  2. 左側のメニューから「ロール」を選択し、先ほど Lambda 関数を作成した際に自動的に作成された IAM ロールを探します。(ロール名には lambda-exection などが含まれていることが多いです)
  3. 該当のロールをクリックし、「ポリシーをアタッチ」ボタンをクリックします。
  4. ポリシーを検索する画面が表示されるので、「SecretsManager」と入力して検索します。
  5. 検索結果から「AWSSecretsManagerReadOnlyAccess」というポリシーを選択し、「ポリシーのアタッチ」ボタンをクリックします。

これで、Lambda 関数が Secrets Manager のシークレットを読み取るための基本的な権限が付与されました。

3. Amazon EventBridge (CloudWatch Events) の設定 – 定期的な実行スケジュールの設定

3.1. EventBridge とは? なぜ定期実行に使う?

Amazon EventBridge (旧 CloudWatch Events) は、AWS のサービス間で発生するイベントを監視し、それらのイベントに応じた処理を自動的に行うことができるサービスです。

今回のツールでは、Gmail を定期的にチェックして新しいメールを取得し、Google Calendar を更新する必要があります。そのため、EventBridge のスケジュール機能を利用して、Lambda 関数を定期的に実行する設定を行います。

3.2. EventBridge ルールの作成とスケジュールの設定

それでは、Lambda 関数を定期的に実行するための EventBridge ルールを作成しましょう。

  1. AWS マネジメントコンソールで EventBridge のサービス画面を開きます。
  2. 画面右上のリージョンが Lambda 関数と同じリージョンになっていることを確認します。
  3. 左側のメニューから「ルール」を選択し、「ルールの作成」ボタンをクリックします。
  4. ルールの名前を入力します。(例: gmail-calendar-sync-schedule
  5. 「イベントソース」セクションで「スケジュール」を選択します。
  6. 「スケジュールパターン」で「cron 式」を選択し、実行したい頻度を設定します。例えば、毎日3時間おきに実行したい場合は、以下の cron 式を入力します。 0 0/3 * * ? * (cron 式の詳細な解説は以下の補足を参照してください)
  7. 「ターゲット」セクションで「Lambda 関数」を選択し、作成した Lambda 関数の名前 (gmail-calendar-sync) を選択します。
  8. 「入力」の設定は、通常はデフォルトのままで構いません。
  9. 「作成」ボタンをクリックします。

これで、設定したスケジュールに従って Lambda 関数が自動的に実行されるようになります。

補足:cron 式の基本的な構文:

cron(分 時 日 月 曜日 年)
  • 分: 0-59
  • 時: 0-23 (UTC タイム)
  • 日: 1-31
  • 月: 1-12 または JAN-DEC
  • 曜日: 0-7 または SUN-SAT (0 と 7 は日曜日)
  • 年: 省略可能

毎日 3 時間おきに実行する cron 式:

0 0/3 * * ? *

解説:

  • 0: 毎時 0 分に実行します。
  • 0/3: 0 分から 3 時間おきに実行します (0, 3, 6, 9, 12, 15, 18, 21 時)。
  • *: 毎月実行します。
  • *: 毎日実行します。
  • ?: 毎日実行します。
  • *: 毎年実行します(省略可能)。

【補足】Google Calendar API 利用のための準備 – GCP での token.json 入手

Google Calendar API を利用するためには、Google Cloud Platform (GCP) でプロジェクトを作成し、API を有効化し、認証情報を取得する必要があります。ここでは、その手順の概要と、認証情報ファイルである token.json の入手方法について解説します。

  1. Google Cloud Platform (GCP) へのアクセス: ブラウザで Google Cloud Console (https://console.cloud.google.com/) にアクセスし、Google アカウントでログインします。
  2. プロジェクトの作成: まだプロジェクトがない場合は、画面上部のプロジェクト選択メニューから「新しいプロジェクト」をクリックし、プロジェクト名を入力して作成します。
  3. Google Calendar API の有効化:
    • 左側のナビゲーションメニューから「API とサービス」>「有効な API とサービス」を選択します。
    • 「+ API とサービスの有効化」をクリックし、検索窓に「Google Calendar API」と入力して検索します。
    • 検索結果から「Google Calendar API」を選択し、「有効にする」をクリックします。
  4. OAuth 2.0 クライアント ID の作成:
    • 左側のナビゲーションメニューから「API とサービス」>「認証情報」を選択します。
    • 「+ 認証情報を作成」をクリックし、「OAuth クライアント ID」を選択します。
    • アプリケーションの種類を選択します。ローカルでの開発や一度限りの認証の場合は「デスクトップ アプリケーション」を選択するのが一般的です。
    • 名前を入力し、「作成」をクリックします。
    • 作成された OAuth クライアント ID とクライアント シークレットが表示されます。これらは AWS Secrets Manager に保存します。
    • 「JSON をダウンロード」 をクリックして、credentials.json ファイルをダウンロードします。このファイルには、クライアント ID とクライアント シークレットが含まれています。
  5. リフレッシュトークンの取得 (ローカルでの実行): AWS 上で直接 OAuth 2.0 の認証フローを行うのは複雑なため、通常はローカル環境で一度認証を行い、リフレッシュトークンを取得します。このリフレッシュトークンを AWS Secrets Manager に保存し、Lambda 関数から利用します。

リフレッシュトークンを取得するための Python スクリプトの例
(必要なライブラリ google-api-python-clientgoogle-auth-httplib2 を事前にインストールしてください):

Python

from __future__ import print_function
import os.path
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build

# スコープ(アクセス権限)の設定
SCOPES = ['https://www.googleapis.com/auth/calendar']

def main():
    creds = None
    # token.json が存在する場合は、そこからクレデンシャルを読み込む
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', SCOPES)
    # クレデンシャルが無効または存在しない場合は、認証フローを実行
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # 初めて認証した場合、クレデンシャルを token.json に保存
        with open('token.json', 'w') as token:
            token.write(creds.to_json())

    print(f"リフレッシュトークン: {creds.refresh_token}")

if __name__ == '__main__':
    main()

このスクリプトをローカルで実行し、認証フローを完了すると、token.json ファイルが生成されます。このファイルの中に含まれる リフレッシュトークン を、AWS Secrets Manager の google_refresh_token の値として保存します。

credentials.json は、このスクリプトを実行するための一時的なファイルなので、安全な場所に保管するか、不要であれば削除しても構いません。

【補足】Gmail のプログラム用パスワードの入手

Gmail アカウントで IMAP を経由してプログラムからアクセスする場合、通常のパスワードではなく、「アプリ パスワード」と呼ばれるプログラム専用のパスワードを使用することを強く推奨します。これにより、セキュリティを向上させることができます。

アプリ パスワードの作成手順:

  1. Google アカウントにアクセス: ブラウザで Google アカウント (https://myaccount.google.com/) にアクセスし、ログインします。
  2. セキュリティ設定へ移動: 左側のナビゲーションメニューから「セキュリティ」を選択します。
  3. 「Google へのログイン」セクションを確認: 「2 段階認証プロセス」が有効になっていることを確認してください。アプリ パスワードを利用するには、2 段階認証プロセスが有効になっている必要があります。もし無効になっている場合は、有効にしてください。
  4. 「アプリ パスワード」を選択: 「Google へのログイン」セクションの下にある「アプリ パスワード」を選択します。(2 段階認証プロセスが有効になっていない場合は表示されません)
  5. アプリとデバイスを選択: 「アプリを選択」ドロップダウンから「メール」を選択します。 「デバイスを選択」ドロップダウンから「その他(名前を入力)」を選択し、任意の名前(例: AWS Lambda Gmail連携)を入力して「生成」をクリックします。
  6. アプリ パスワードをコピー: 生成された 16 桁のアプリ パスワードが表示されます。このパスワードは一度しか表示されません。 安全な場所にコピーして保管してください。このパスワードを、AWS Secrets Manager の gmail_password の値として保存します。

重要な注意点:

  • アプリ パスワードは、特定のアプリとデバイスに対して発行されるため、セキュリティリスクを限定できます。
  • 通常の Gmail パスワードをプログラムに直接使用することは避けてください。

まとめ

この第1段階では、AWS でサーバーレスにコードを実行するための基盤となる Lambda 関数、機密情報を安全に管理するための Secrets Manager、そして Lambda 関数を定期的に実行するための EventBridge の基本的な設定について解説しました。

次の第2段階では、実際に Lambda 関数に Gmail からメールを取得し、内容を読み取るための Python コードを記述していきます。お楽しみに!

コメント

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