Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

【C#】【Dynamics CRM】【Azure】Azure Webサービス Webジョブで定期実行

Dynamics CRM でお客さんがやりたいことリストのトップへ常に名を連ねるものが外部データ連携だと思います。

SFA的に使うにしても、やはり何かしらのデータを外部から持ってこないと始まるものも始まらない、みたいな感じはどこでもありますね。

基本的なアプローチとしては、以下の様なアプローチがあると思います。

・サーバーにバッチ処理アプリを作成してタスクスケジューラで定期実行

・完全信頼Pluginで外部アクセスし、Dynamics CRMにデータを取り込む

SSIS・BizTalkなどのツールを使う(予算があれば)

ツール関係は漁れば色々とあるかもしれません。

ですが、基本的にオンプレミス前提的な感じが、ちょっと気持ち悪かったので、クラウドベースで、かつお金があまりかからない感じの範囲で何かできないかと思い、探ってみました。

で、前置きが長くなりましたが、見つけた1つのアプローチが、Azure WebサービスにWebジョブを登録するというものでした。

AzureWebサービス のWebジョブ

AzureWebサービスはご存知の方も多いので、割愛します。

Webジョブは上記AzureWebサービスに追加登録することで、Azure上で定期実行的なバッチ処理をスケジューリングできるサービスです。(裏ではAzureスケジュールが生成されています。)

プログラムを含めたZipファイルをアップして、定期的に実行でき、以下のファイルをサポートしています。

.cmd, .bat, .exe (using windows cmd)

.ps1 (using powershell)

.sh (using bash)

.php (using php)

.py (using python)

.js (using node)

今回はここにDynamics CRMとConnectionできるexeファイルを登録しようという魂胆です。

azure.microsoft.com

環境

Dynamics CRM Online 2015(7.0)

Dynamics CRM SDK(7.0)

.NET Frameworks 4.5

必要な参照

Microsoft.Xrm.Sdk Microsoft.Xrm.Client

そして、私がハマったのが【Microsoft.IdentityModel】 これが無いと、Webジョブの実行時にIdentityModelが足りませんって怒られます。

以下から追加しておきます。

C:\Program Files\Reference Assemblies\Microsoft\Windows Identity Foundation\v3.5 Microsoft.IdentityModel.dll

コード

コードはシンプルにCrmOnlineにAccountレコードを作成するだけのものです。

using System;
using Microsoft.Xrm.Client;
using Microsoft.Xrm.Client.Services;
using Microsoft.Xrm.Sdk;

namespace MyProject.AzureWebJob
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Start Azure Web Job");

            var connection = CrmConnection.Parse("Url=https://XXX.crm7.dynamics.com; Username=XXX@XXX.onmicrosoft.com; Password=XXX;");
            var service = new OrganizationService(connection);

            Entity entity = new Entity("account");

            entity["name"] = "Azure Web Service Test";

            service.Create(entity);

            Console.WriteLine("End Azure Web Job");
        }
    }
}

設置手順

事前にAzureWebサイトは作成しておきます。

1.上記コードをビルドし、exeが含まれるDebugフォルダをZip圧縮しておきます。

f:id:sugimomoto:20150413172126p:plain

2.AzureWebサイト管理画面の[Webジョブ]をクリック。

f:id:sugimomoto:20150413173248p:plain

3.[追加]ボタンをクリック。

4.基本Webジョブ設定画面が表示されるので、任意の名前、プログラムのZipファイルを選択。実施方法は、今回わかりやすいようオンデマンドで実行を選びました。

f:id:sugimomoto:20150413173343p:plain

5.以下のように、Webジョブが登録されます。対象のWebジョブを選択して[一度だけ実行する]をクリックすると、登録されているコンソールアプリケーションが実行されます。

f:id:sugimomoto:20150413172421p:plain

6.実行ログを確認することも可能です。コンソールアプリケーションと同様にConsole.Write、WriteLineなどで、ログを出力することが可能です。

Successになっていれば、処理成功。失敗してもここのログからある程度情報を確認できるので、便利ですね。

f:id:sugimomoto:20150413172457p:plain

f:id:sugimomoto:20150413172521p:plain

ちなみに、上記ジョブを作成すると裏ではAzureスケジューラが作成されています。

初期状態では標準プランで作成され、無料に切り替えないと課金されてしまうおそれがあるので、ご注意ください。

f:id:sugimomoto:20150413172554p:plain

実行結果

CRMの画面ですが、以下のようにレコードが作成されていることがわかります。

f:id:sugimomoto:20150413172816p:plain

リソースについて

このWebジョブ、一番気になるところとしては、メモリやCPUをどうしているの? というところだと思います。 Webジョブでは、WebサービスのメモリやCPUリソースを利用し、実行しているため、Webサービスでの課金状況にシンクロします。

以下、Webサービスはなんにもしていないのですが、リソースをある程度使っていることがわかります。

f:id:sugimomoto:20150413173026p:plain

その他

もちろん、WebサービスのWebAPIでもいいっちゃいいのですがね……。

まあ、でもFTPサーバーにCSVファイルをおいてもらって、バッチ処理でアクセスして持ってくるなら、もうちょっと色々と処理が可能かなぁ。