コルネの進捗や備忘録が記されたなにか

進捗や成果物や備忘録てきななにかを雑に更新していきます。

Visual StudioでDev Tunnelsを利用してカスタムコネクタの作成練習を行う


スポンサードリンク

はじめに

Power Platformでは、1,000以上のコネクタが用意されています。
Power Platformではこれらのコネクタを利用することで外部サービスとの連携がノーコード/ローコードで行えるようになっているわけですね。

しかし自身が利用したいサービスのAPIが公開されているにも関わらず、予めコネクタが提供されていないようなサービスもあります。
これは自社サービスなどの独自に作成したAPIサービスなども含まれますね。

そのような場合Power AutomateのHTTP要求で接続する方法もありますが、カスタム コネクタという独自のコネクタを作成して利用、共有を行う方法があります。

learn.microsoft.com

今回はこのカスタム コネクタという機能を勉強するにあたり、利用できる技術を紹介します。

対象者は開発がちょっとわかる方(ネットスラングではなく、文字通りの意味)を対象にしています。

利用する技術

カスタム コネクタを利用するにはAPIが必要です。

APIの利用には一般に公開されているAPIを利用する方法や、自身で開発したAPIをAzure FunctionsなどのAPIサーバーを用意する方法があります。

前者ですと公開されているAPIAPI仕様ベースでしかカスタム コネクタの検証は行えません。
また、対象のサービス利用制限を考慮する必要もあります。

後者ですと、APIを利用するための料金が掛かります。

そこで今回はVisual StudioのDev tunnelsを利用してテスト用のAPIを用意したいと思います。

learn.microsoft.com

Visual Studio 2022のDev Tunnelsを利用する

前提条件

以下が必要です。

Web APIを作成する

Webプロジェクトを作成する

こちらのチュートリアルベースで紹介します。

learn.microsoft.com

「新しいプロジェクトの作成」より「ASP.NET Core Web API」を選択して「次へ」を選択します。

任意のプロジェクト名とプロジェクトを作成するフォルダの場所を選択して「次へ」を選択します。

以下となっていることを確認して「作成」を選択します。

  • フレームワーク: .NET 8.0(長期サポート)
  • 「コントローラーを使用する」にチェックが入ってる
  • 「OpenAPI サポートを有効にする」にチェックが入ってる

「ツール」 > 「NuGet パッケージ マネージャー」 > 「ソリューションの NuGet パッケージの管理」を選択します。

「参照」タブを選択して、「Microsoft.EntityFrameworkCore.InMemory」を選択します。
その後、右側のウィンドウが表示されるので、「プロジェクト」にチェックをして「インストール」を選択してインストールを行います。

プロジェクトをテストする

Ctrl + F5 もしくは、「デバッグ」 > 「デバッグなしで開始」を選択します。

SSL を使用するようにプロジェクトが構成されていないので以下ダイアログが表示されますが、「はい」を選択します。

こちらも「はい」を選択して証明書のインストールを行います。

既定のブラウザーが起動し、以下のような画面が表示されます。

APIのテストをしてみましょう。

「GET」を選択します。

「Try it out」を選択します。

「Execute」を選択します。

その結果以下のような応答が得られるはずです。

Dev Tunnelsを作成する

トンネルを作成する

APIの用意が完了したので、Dev Tunnelsを試してみます。

https」 > 「Dev Tunnels」 > 「トンネルを作成」を選択します。

トンネル作成のダイアログが表示されますので、それぞれ入力を行います。

  • アカウント: トンネル作成に使用するアカウントを選択します。
  • 名前: トンネルの名前を入力します。
  • トンネルの種類: 「一時的」または「永続的」を選択します。
  • アクセス: トンネルのアクセスに必要な認証情報を選択します。カスタム コネクタで利用する場合は公開用を選択します。
    • 非公開: トンネルにアクセスできるのはトンネルを作成したアカウントだけです。
    • 公開用: トンネルへのアクセスには認証は必要ありません。このオプションを選択すると、インターネット上のすべてのユーザーがWebアプリ、またはAPIにアクセスできるようになるので注意してください。
    • 組織: トンネルにアクセスできるのはトンネルを作成したアカウントと同じ組織内のアカウントだけです。「アカウント」でGitHubを選択した場合はこちらのオプションは選択できません。

「OK」を選択すると以下のようなダイアログが表示され、「開発トンネル」で先ほど作成したトンネルが表示されます。

トンネルを使用する

「開発トンネル」にて、先ほど作成したトンネルが選択されていることを確認します。

先ほど作成したトンネルが選択されていることを確認した後、Ctrl + F5 もしくは、「デバッグ」 > 「デバッグなしで開始」を選択します。

既定のブラウザーが起動し、以下のような画面が表示されますので「続行」を選択します。

その結果、先ほどと同じWebアプリが起動するかと思いますが、URLがlocalhostではなくなっているかと思います。

  • デバッグ: https://localhost:7223/swagger/index.html
  • デバッグ: https://50tt58xr-7223.usw2.devtunnels.ms/swagger/indexf.html

Dev Tunnelsで作成されたAPIを利用してカスタムコネクタを作成する

あとはカスタム コネクタの作成方法と同じです。

Power Appsにアクセスして、「カスタム コネクタ」の新規作成を行います。

今回は「一から作成」を行います。

「ホスト」にDev TunnelsのURLを入力します。

要求と応答を入力して、定義の作成を行います。

コネクタを作成して、テストを行います。

問題なければ以下のように応答が返ってくるはずです。

Power Appsから呼び出してみる

先ほど作成したカスタム コネクタをPower Appsに追加して呼び出してみます。

問題なければ以下のようなテーブルが得られるはずです。

APIデバッグを行う

Power AppsやPower Automateから呼び出したカスタム コネクタのデバッグを行うことも可能です。

やり方は、Visual Studioで「デバッグの開始」(F5)を行い、カスタム コネクタの呼び出しを行うだけです。

後は、通常の開発時のデバッグの時のように確認したい箇所にブレークポイントを設定しておくだけです。

作成したAPIがカスタム コネクタから呼び出した場合に想定通りに呼び出されない場合などの検証時に利用できますね。

APIの更新を行う

通常の開発時と同様にホットリロードによる更新も可能です。

モデル クラスの追加

こちらを参考に行います。

learn.microsoft.com

ソリューション エクスプローラーにてプロジェクトを右クリックして、「追加」 > 「新しいフォルダー」を選択します。

作成されたフォルダーを「Models」にリネームし、右クリックして、「追加」 > 「クラス」を選択します。

「TodoItem」という名前のクラスを追加します。

以下コードに更新します。

namespace TodoApi.Models;

public class TodoItem
{
    public long Id { get; set; }
    public string? Name { get; set; }
    public bool IsComplete { get; set; }
}

データベース コンテキストの追加

先ほど「TodoItem」クラスを追加したときと同様の方法で続いては、「TodoContext」クラスの追加を行います。

追加したクラスには以下のコードに置き換えます。

using Microsoft.EntityFrameworkCore;

namespace TodoApi.Models;

public class TodoContext : DbContext
{
    public TodoContext(DbContextOptions<TodoContext> options)
        : base(options)
    {
    }

    public DbSet<TodoItem> TodoItems { get; set; } = null!;
}

データベース コンテキストの登録

Program.cs を以下のコードで更新します。

using Microsoft.EntityFrameworkCore;
using TodoApi.Models;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
builder.Services.AddDbContext<TodoContext>(opt =>
    opt.UseInMemoryDatabase("TodoList"));
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

追加されたのは以下3行です。

+ using Microsoft.EntityFrameworkCore;
+ using TodoApi.Models;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
+ builder.Services.AddDbContext<TodoContext>(opt =>
 +    opt.UseInMemoryDatabase("TodoList"));
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

コントローラーのスキャフォールディング

「Controller」フォルダを右クリックして、「追加」 > 「新規スキャフォールディングアイテム」を選択します。

「Entity Framework を使用したアクションがある API コントローラー」を選択して「追加」を選択します。

ダイアログが表示されるので、以下を選択して「追加」を行います。

  • モデル クラス: 「TodoItem (TodoApi.Models)」 を選択します。
  • データ コンテキスト クラス: 「TodoContext (TodoApi.Models)」 を選択します。

追加が行われるとコントローラー名で設定したコントローラーが追加されます。
スクショの例でいうと TodoItemsController.cs が追加されます。

PostTodoItem 作成メソッドの更新

nameof 演算子を使用するために、PostTodoItem で return ステートメントを更新します。

TodoItemsController.cs の l: 78 あたりを以下のように変更します。

[HttpPost]
public async Task<ActionResult<TodoItem>> PostTodoItem(TodoItem todoItem)
{
    _context.TodoItems.Add(todoItem);
    await _context.SaveChangesAsync();

    // return CreatedAtAction("GetTodoItem", new { id = todoItem.Id }, todoItem);
    return CreatedAtAction(nameof(GetTodoItem), new { id = todoItem.Id }, todoItem);
}

ホットリロード

Alt + F10 もしくはホットリロードボタンを選択して、ホットリロードを行います。

その結果、Webアプリの更新が行われるはずです。

テスト

PostTodoItem のテスト

POST /api/TodoItems のテストを行います。

Bodyに以下JSONを設定して実行を行います。

{
  "name": "walk dog",
  "isComplete": true
}

その結果以下アイテムが追加されます。

Locationヘッダー URI のテスト

GET /api/TodoItems/{id} のテストを行います。

先ほど作成されたアイテムの id を指定して実行を行います。

その結果、先ほど作成されたアイテムが取得されるはずです。

存在しないアイテムを指定した場合、 404 が返ってくるはずです。

GETメソッドのテスト

GET /api/TodoItems のテストを行います。

このメソッドではアプリ実行中に追加されたアイテムをすべて返します。

PutTodoItem メソッドのテスト

PUT /api/TodoItems/{id} のテストを行います。

このメソッドでは指定した id のアイテムの更新を行います。

DeleteTodoItem メソッドのテスト

DELETE /api/TodoItems/{id} のテストを行います。

このメソッドでは指定した id のアイテムの削除を行います。

カスタム コネクタの更新を行う

Power Appsにアクセスして、「カスタム コネクタ」の編集を行います。

先ほど追加したアクションの定義を追加します。

カスタム コネクタを利用中のアプリでは、カスタム コネクタの更新がないので、一度削除してから再度追加を行います。

問題なくアクションが呼び出せていることを確認します。

関連記事

こちらもよければご参照ください。

koruneko.hatenablog.com

おわりに

カスタム コネクタの作成練習だけでなく、自社でAPI開発を行い、そのAPIをPower Platformで利用させたい場合この技術を開発者側は知っていた方が、よりトラブルなくカスタム コネクタの組織への展開ができるようになるかと思います。

プロ開発者と市民開発者とで開発するリソースを分担し、組織の内の開発を効率的に進めましょう!


スポンサードリンク