CData Software Blog

クラウド連携のCData Software の技術ブログです。

CData Google Calendar Driversでサービスアカウントを使って接続する

こんにちは。CDataエンジニアの浦邊です。 本記事ではCData Google Calendar Driverでサービスアカウントを使う手順を説明します。

サービス アカウントは、個人ではなくアプリケーションやVMに属する特別なアカウントです。 複数人が使うアプリケーションからGCPAPIにアクセスする場合などに利用します。 いくつかのGoogleのサービスではサービスアカウントを作成すればすぐにサービスにアクセスできるようになりますが、Google Calendarではカレンダーの共有など追加の設定が必要です。 この記事ではサービスアカウントの作成からユーザのスケジュール取得までの各ステップを説明します。

今回は以下のシナリオを前提に説明します。 Google Calendarのユーザ(user1@test.page)のアカウントでサービスアカウントを作成し、当該ユーザのカレンダーにアクセスできるようにします。

f:id:urabe_shintaro:20210329184801p:plain

CData Google Calendar Driverを使用しないで、Google Calendar APIにサービスアカウントからアクセスする方法については以下の記事をご覧ください。

www.cdatablog.jp

ステップ概要

以下の表はサービスアカウントを使ってGoogle Calendar APIにするまでの大まかなステップと、各ステップが画面、APIまたはドライバを通してできるかどうかを表しています。 APIの有効化とサービスアカウントの作成はGoogle Cloud Platformの画面上で行います。 サービスアカウントへのカレンダーの共有、カレンダーリストへのカレンダーの追加などAPIでできるステップはドライバでも可能です。

ステップ 画面 API ドライバ
1.APIの有効化 O X X
2.サービスアカウントの作成 O X X
3.サービスアカウントへのカレンダーの共有 O O O
4.カレンダーリストへのカレンダーの追加 X O O

1. APIの有効化

Google CalendarのユーザアカウントでGoogle Cloud Platformにログインし、ナビゲーションメニューの[APIとサービス]から[ライブラリ]を開きます。 サービス一覧からGoogle Calendar APIを選択し、[有効にする]をクリックします。

f:id:urabe_shintaro:20210326154757p:plain

2. サービスアカウントの作成

Google CalendarのユーザアカウントでGoogle Cloud Platformにログインします。

2.1 OAuth同意画面の作成

はじめにGoogle Calendar APIにアクセスするアプリを作成します。 ナビゲーションメニューの[APIとサービス]から[OAuth同意画面]を開きます。 [User Type]を選択し、[作成]をクリックします。 [User Type]はアプリの公開範囲に従って選択してください。 因みに「内部」はGoogle Workspace (旧G Suite)の組織内のアカウントの場合のみ選択可能です。

f:id:urabe_shintaro:20210330090548p:plain

[アプリ名]に適当な名前を入力し、[ユーザサポートメール][デベロッパーの連絡先情報]にメールアドレスを入力します。

f:id:urabe_shintaro:20210326155036p:plain

これ以降の画面では特に何も設定せず、すべて[保存して次へ]をクリックします。

2.2 サービスアカウントの作成

ナビゲーションメニューの[APIとサービス]から[認証情報]を開きます。 [認証情報の作成]を開き、[サービスアカウント]を選択します。

f:id:urabe_shintaro:20210326155135p:plain

適当なサービスアカウント名を入力し、[完了]をクリックします。

f:id:urabe_shintaro:20210326155202p:plain

2.3 サービスアカウントのキーの生成

サービスアカウント一覧から作成したサービスアカウントを選択し詳細画面を開きます。 [キー]タブを選択し、[鍵を追加]を開いて[新しい鍵を作成]をクリックします。

f:id:urabe_shintaro:20210326155303p:plain

希望する鍵タイプをチェックし[作成]をクリックします。ここでは「JSON」を選択します。

f:id:urabe_shintaro:20210326155314p:plain

鍵が生成されダウンロードされます。 このファイルはドライバからの接続時に必要となりますので保管しておいてください。

f:id:urabe_shintaro:20210326155334p:plain

3.サービスアカウントへのカレンダーの共有

サービスアカウントからアクセスするユーザ(user1@test.page)のカレンダーをサービスアカウントに共有します。 このステップは画面またはドライバで実施できます。

画面で共有する場合

User1のGoogle Calendarを開きます。 カレンダーのオーバーフローメニューを開いて(マウスオーバーすると表示されるアイコンをクリック)、[設定と共有]をクリックします。

f:id:urabe_shintaro:20210326155504p:plain

[カレンダーの設定]を開き、[特定のユーザとの共有]セクションで[ユーザの追加]をクリックします。

f:id:urabe_shintaro:20210326155524p:plain

サービスアカウントのメールアドレスを入力し、[権限]を選択して[送信]をクリックします。 今回は権限としてフルアクセスを行う「変更及び共有の管理権限」を選択しました。

f:id:urabe_shintaro:20210326155536p:plain

以下のように共有にサービスアカウントが追加されたことを確認してください。

f:id:urabe_shintaro:20210326155754p:plain

ドライバで共有する場合

ドライバからUser1のアカウントで接続し、以下のSQLを実行します。 接続方法はどのような方法でも構いません。

insert into AccessControlRules(CalendarId, [Role], ScopeType, ScopeValue) values('<ユーザのカレンダーID>','owner','user','<サービスアカウントのメールアドレス>');

例:User1のカレンダーをサービスアカウントに共有する

insert into AccessControlRules(CalendarId, [Role], ScopeType, ScopeValue) values('user1@test.page','owner','user','serviceaccounttest@project1.iam.gserviceaccount.com');

4.カレンダーリストへのカレンダーの追加

最後にサービスアカウントのカレンダーリストにユーザのカレンダーを追加します。

サービスアカウントでの接続

ドライバからサービスアカウントで接続します。 接続プロパティの設定値は以下の通りです。

プロパティ名
InitiateOAuth "GETANDREFRESH"
OAuthJWTCertType "GOOGLEJSON"
OAuthJWTCert 鍵ファイルのパス
OAuthJWTCertSubject "*"

OAuthJWTCertにはサービスアカウント作成時に取得した鍵ファイルのパスを指定してください。

JDBCドライバで接続する際の接続文字列の例を以下に示します。

JDBCドライバの接続文字列例

jdbc:googlecalendar:InitiateOAuth=GETANDREFRESH;OAuthJWTCertType=GOOGLEJSON;OAuthJWTCert=C:\OAuthJWTCert\testproject-308110-d361062d700d.json;OAuthJWTCertSubject="*";

カレンダーリストへのユーザカレンダーの追加

ドライバから以下のSQLを実行します。

insert into Calendars(Id) values ('<ユーザのカレンダーID>');

例:User1のカレンダーをカレンダーリストに追加する

insert into Calendars(Id) values ('user1@test.page');

複数ユーザのカレンダーにアクセスする場合

これまでの手順で、サービスアカウントからUser1のカレンダーのスケジュールを取得する方法を紹介しました。 他のユーザのカレンダーも取得できるようにする際は、カレンダーごとにステップ3の共有設定とステップ4のカレンダーリストへの追加を行ってください。

f:id:urabe_shintaro:20210415113842p:plain

実行確認

それではサービスアカウントで接続しデータを取得してみます。

今回実行確認用に用意したUser1のカレンダーには5件のスケジュールが登録されています。

f:id:urabe_shintaro:20210415101617p:plain

テーブル一覧を取得

ドライバのテーブル一覧を取得します。

SQL1: テーブル一覧を取得

select TableName, Description from sys_tables;

SQL1: 実行結果

user1@test.pageのカレンダーが追加されています。

f:id:urabe_shintaro:20210415120804p:plain

スケジュール取得

User1のカレンダーからスケジュールを取得します。

SQL2: User1のカレンダーからスケジュールを取得

select Summary, StartDateTime, EndDateTime, ColorId  from [user1@test.page];

SQL2: 実行結果

User1のスケジュールが取得できました。

f:id:urabe_shintaro:20210415115420p:plain

スケジュール登録

User1のカレンダーに新しいスケジュールを登録します。

SQL3: User1のカレンダーにスケジュールを登録

insert into [user1@test.page](Summary, StartDateTime, EndDateTime) values('面談','2021-05-07 14:00:00','2021-05-07 15:00:00');

SQL3: 実行結果

登録したスケジュールが画面上で確認できました。

f:id:urabe_shintaro:20210415101552p:plain

おわりに

今回はCData Google Calendar Driversでサービスアカウントを使う方法を説明しました。 CData Google Calendar Driversは30日間無料でお使いいただけます。 Google Calendarとの連携をご検討の方はぜひお試しください。