LoginSignup
2
0

More than 1 year has passed since last update.

AzureFunctionsでGoogle Workspaceのレポートデータを取得する

Last updated at Posted at 2021-07-29

こんにちは、ATL Systems 鍋島です。
今回は、Azure Functionsで Google Workspaceのレポートデータを取得する手順について説明していきます。

ちなみに、Consoleアプリで実行する場合は、こちらのドキュメントを公式参考にしてください。
OAuth 認証を使ったサンプルコードがあります。
Google Workspace Admin SDK > .Net >.NET quickstart

Reports APIをAzure Functionsなどサーバーで利用する場合、OAuthによる認証を利用できません。今回は検証のため、その代わりにサービスアカウントを使っています。

サービス アカウント キーは、不正使用されるとセキュリティ上のリスクになる可能性があります。サービス アカウント キーをダウンロードするのではなく、代わりに Workload Identity 連携を使用することをおすすめします。

Workload Identityについては以下のドキュメントを参照してください。

Google Consoleでプロジェクトを追加

まずはサービスアカウントを作る前にプロジェクトを作成します。

Google Consoleにログインします。
https://console.cloud.google.com/

次に、Google Cloud Platformで新しいプロジェクトを追加します。
ここではプロジェクト名を AzureFunctionProject とします。

image.png

プロジェクトを作成したら、作成したプロジェクトに切り替えます。
image.png

Admin SDK APIの有効化

次に利用するAPIを有効化します。ここでは Admin SDK APIを有効化していきます。
image.png

Admin SDK API を検索して、有効にする ボタンをクリックします。
image.png

Google Consoleでサービスアカウントの追加

次に、認証情報を作成ボタンをクリックして、認証情報追加していきます。
image.png
使用するAPIはAdmin SDK APIを選択し、アクセスするデータの種類は アプリケーションデータを選択します。
image.png
ロールはオーナーを選択します。
image.png
最後に完了をクリックして、認証情報の追加を完了します。
image.png

サービスアカウントが作成されたことを確認します。
image.png

次にReports APIを利用するために、サービスアカウントの設定を変更て、
Google Workspace ドメイン全体の委任を有効にする にチェックを入れます。

image.png

チェックを入れると
ドメイン全体の委任を変更するには、OAuth 同意画面でプロダクト名を構成する必要があります。
と表示されるので、プロダクト名を入力して、保存 ボタンをクリックします。

image.pngimage.png

Google AdminでクライアントIDの追加

Google Admin で APIの制御 にアクセスします。

Google Admin > セキュリティ > APIの制御 にアクセスします。
https://admin.google.com/ac/owl/domainwidedelegation?hl=ja

次に[新しく追加] ボタンをクリックして、新しいクライアントIDを追加します。ここで登録するクライアントIDは Google Cloud Consoleで追加したサービスアカウントのクライアントIDです。

以下のドキュメントを参考にOAUTHスコープも追加します。
https://developers.google.com/admin-sdk/reports/v1/guides/authorizing

範囲 意味
https://www.googleapis.com/auth/admin.reports.audit.readonly アクティビティレポートを取得するときの読み取り専用アクセス。
https://www.googleapis.com/auth/admin.reports.usage.readonly 使用状況レポートを取得するときの読み取り専用アクセス。

image.png

image.png

サービスアカウントで秘密鍵の作成

Google Cloud Platformに戻り、サービスアカウントメニューから作成したサービスアカウントを表示して、キータブを表示します。
image.png

JSONを選択して、作成ボタンをクリックして、秘密鍵ファイルを作成します。
image.png

秘密鍵入りのJSONファイルが端末へ保存されると、以下のメッセージが表示されます。
image.png

AzureFunctions のプロジェクトの作成

Visual Studio 2019を起動し、新しいプロジェクトを作成します。
image.png

スケジュールされた間隔で実行される、Time trigger を選択します。
image.png

ちなみに実行間隔を5分から1分に変更するには 5 を 1に変更します。
image.png

パッケージマネージャーコンソールで必要なパッケージ Google.Apis.Admin.Reports.reports_v1を追加します。

PM> Install-Package Google.Apis.Admin.Reports.reports_v1

秘密鍵ファイルを追加します。

サービスアカウントで作成した秘密鍵ファイルをプロジェクトに追加します。
その際、ファイルのプロパティで出力ディレクトリにコピーを常にコピーするに変更します。

image.png

最後に、Azure Functionsのコードを変更します。
Functions1.csを開いて、以下のコードを貼り付けます。
コード中の以下のワークスペース名や定数については各自の環境に合わせて変更してください。

項目
Google Workspaceの管理者ユーザ foo@exmaple.com
秘密鍵のファイル名 azurefunctionproject-123456789.json
using Google.Apis.Admin.Reports.reports_v1;
using Google.Apis.Admin.Reports.reports_v1.Data;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using static Google.Apis.Admin.Reports.reports_v1.ActivitiesResource.ListRequest;

namespace GoogleWorkspaceReportsFunctionApp
{
    public static class Function1
    {
        static string[] Scopes = { ReportsService.Scope.AdminReportsAuditReadonly, ReportsService.Scope.AdminReportsUsageReadonly };
        static string ApplicationName = "Reports API .NET Quickstart";
        static string User = "foo@example.com";
        static string JsonPath = "azurefunctionproject-123456789.json";
        [FunctionName("Function1")]
        public static void RunAsync([TimerTrigger("0 */1 * * * *")] TimerInfo myTimer, ILogger log)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
            

            //以下のドキュメントが参考になった。
            //CreateWithUserで特定のユーザとしてクレデンシャルを作成すると401にならない。
            //https://github.com/googleapis/google-api-dotnet-client/issues/1629
            var credential = GoogleCredential.FromFile(JsonPath).CreateScoped(Scopes).CreateWithUser(User);

            // Create Reports API service.
            var service = new ReportsService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = ApplicationName,
            });

            // Define parameters of request.
            ActivitiesResource.ListRequest request = service.Activities.List("all", ApplicationNameEnum.Login);
            request.MaxResults = 10;
            // List activities.
            IList<Activity> activities = request.Execute().Items;
            Console.WriteLine("Logins:");
            if (activities != null && activities.Count > 0)
            {
                foreach (var activityItem in activities)
                {
                    Console.WriteLine("{0}: {1} {2}", activityItem.Id.Time,
                        activityItem.Actor.Email,
                        activityItem.Events.First<Activity.EventsData>().Name);
                }
            }
            else
            {
                Console.WriteLine("No logins found.");
            }
            Console.Read();
        }
    }
}

エミュレーターの実行

最後にエミュレータを実行して試します。

image.png

image.png

うまくいきましたね!

#まとめ
Azure Functionsのエミュレータで Google Workspaceのレポートデータを取得できました。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0