3.1.5

Microsoft Azure

Azure (英語) アダプターは、Spring Cloud Function コンテキストをブートストラップし、必要に応じて Spring Boot 構成を使用して、Azure フレームワークからユーザー関数に関数呼び出しをチャネルします。Azure Functions は、プラットフォームに固有のユーザーコード内のアノテーションを含む、非常にユニークですが侵襲的なプログラミングモデルを備えています。Spring Cloud でこれを使用する最も簡単な方法は、基本クラスを継承し、その中に基本クラスのメソッドに委譲する @FunctionName アノテーションを含むメソッドを記述することです。

このプロジェクトは、Spring Cloud Function アプリケーション用のアダプターレイヤーを Azure に提供します。型 Function の単一の @Bean を使用してアプリを作成でき、JAR ファイルが正しくレイアウトされていれば、Azure でデプロイできます。

拡張する必要のある org.springframework.cloud.function.adapter.azure.FunctionInvoker があり、入力型と出力型をアノテーション付きメソッドパラメーターとして提供します(Azure がクラスをインスペクションして JSON バインディングを作成できるようにします)。基本クラスには、実際の関数呼び出しを委譲できる 2 つの便利なメソッド(handleRequest と handleOutput)があるため、ほとんどの場合、関数には 1 行しかありません。

例:

public class FooHandler extends FunctionInvoker<Foo, Bar> {
	@FunctionName("uppercase")
	public Bar execute(@HttpTrigger(name = "req", methods = {HttpMethod.GET,
			HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<Foo>> request,
		ExecutionContext context) {
		return handleRequest(request.getBody().get(), context);
	}
}

この Azure ハンドラーは、Function<Foo,Bar> Bean(または Function<Publisher<Foo>,Publisher<Bar>>)に委譲します。一部の Azure トリガー(@CosmosDBTrigger など)は、List の入力型になります。その場合、Azure ハンドラーで ListString (生の JSON)にバインドできます。List 入力は、入力型 Map<String,Object>、または同じ型の Publisher または List の Function に委譲します。Function の出力は、List (1 対 1)または単一の値(集約)にすることができ、Azure 宣言の出力バインディングは一致する必要があります。

アプリに Function などの型の @Bean が複数ある場合は、function.name を構成して使用する @Bean を選択できます。または、Azure ハンドラーメソッドの @FunctionName を関数名と一致させると、そのように機能するはずです(複数の関数を持つ関数アプリの場合も同様です)。関数は Spring Cloud FunctionCatalog から抽出されるため、デフォルトの関数名は Bean 名と同じです。

Azure へのアクセス ExecutionContext

Azure ランタイムによって com.microsoft.azure.functions.ExecutionContext の形式で提供されるターゲット実行コンテキストにアクセスする必要がある場合があります。たとえば、そのようなニーズの 1 つはロギングであるため、Azure コンソールに表示できます。

その目的のために、ExecutionContext を executionContext 名のメッセージヘッダーとして伝播するため、必要なのは関数がメッセージを受け入れ、このヘッダーにアクセスすることだけです。

Spring Cloud Function は、アプリケーションコンテキストで ExecutionContext を Bean として登録するため、関数に挿入できます。たとえば

@Bean
public Function<Message<Foo>, Bar> uppercase() {
	return message -> {
		ExecutionContext targetContext = message.getHeaders().get("executionContext");
		targetContext.getLogger().info("Invoking 'uppercase' on " + foo.getValue());
		return new Bar(message.getPayload().getValue().toUpperCase());
	};
}

メッセージを使用すると、リクエストの一部として送信されるメッセージヘッダーとして、追加の Azure メタ情報にもアクセスできます。

JAR レイアウトに関する注記

Azure の実行時には Spring Cloud Function Web は必要ないため、Azure にデプロイする JAR を作成する前にこれを除外できますが、含めても使用されないため、そのままにしても問題ありません。Azure 上の関数アプリケーションは、Maven プラグインによって生成されたアーカイブです。この関数は、このプロジェクトによって生成された JAR ファイル内に存在します。このサンプルでは、Azure がハンドラークラスを見つけられるように、シンレイアウトを使用して実行可能ファイル jar として作成します。必要に応じて、通常のフラット JAR ファイルを使用することもできます。依存関係は含めないでください。

ビルドファイルの設定

Microsoft Azure で Spring Cloud Function アプリケーションを実行するには、クラウドプラットフォームプロバイダーが提供する Maven プラグインを利用できます。

Maven のアダプタープラグインを使用するには、プラグインの依存関係を pom.xml ファイルに追加します。

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-function-adapter-azure</artifactId>
	</dependency>
</dependencies>

次に、プラグインを構成します。resourceGroupappName、その他のオプションのプロパティを指定して、アプリケーションに Azure 固有の構成を提供し、Azure に必要な function.json ファイルが生成されるように package ゴールの実行を追加する必要があります。完全なプラグインドキュメントは、プラグインリポジトリにあります [GitHub] (英語)

<plugin>
	<groupId>com.microsoft.azure</groupId>
	<artifactId>azure-functions-maven-plugin</artifactId>
	<configuration>
		<resourceGroup>${functionResourceGroup}</resourceGroup>
		<appName>${functionAppName}</appName>
	</configuration>
	<executions>
		<execution>
			<id>package-functions</id>
			<goals>
				<goal>package</goal>
			</goals>
		</execution>
	</executions>
</plugin>

また、プラグインによってスキャンされるファイルが Azure functions ステージングディレクトリにあることを確認する必要があります (ステージングディレクトリとそのデフォルトの場所の詳細については、プラグインリポジトリ [GitHub] (英語) を参照してください)。

Spring Cloud Function アプリケーションを Maven を使用して Microsoft Azure にデプロイするためのサンプル pom.xml ファイル全体は、ここにあります。

現在のところ、Maven プラグインのみが利用可能です。Gradle プラグインは、クラウドプラットフォームプロバイダーによって作成されていません。

ビルド

./mvnw -U clean package

サンプルの実行

他の Spring Cloud Function サンプルと同様に、サンプルをローカルで実行できます。



および curl -H "Content-Type: text/plain" localhost:8080/api/uppercase -d '{"value": "hello foobar"}'

az CLI アプリが必要になります(詳細については、https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-first-java-maven を参照してください)。Azure ランタイムに関数をデプロイするには:

$ az login
$ mvn azure-functions:deploy

別のターミナルでこれを試してください: curl https://<azure-function-url-from-the-log>/api/uppercase (英語) -d '{"value": "hello foobar!"}'。上記の機能に正しい URL を使用していることを確認してください。または、Azure ダッシュボード UI で関数をテストすることもできます(関数名をクリックし、右側に移動してテストをクリックし、右下の実行をクリックします)。

Azure サンプルの関数の入力型は、"value" と呼ばれる単一のプロパティを持つ Foo です。以下のようなものでテストするには、これが必要です。

{
  "value": "foobar"
}
Azure サンプルアプリは、「機能しない」スタイルで記述されています(@Bean を使用)。機能スタイル(Function または ApplicationContextInitializer のみ)は、Azure での起動時に、従来の @Bean スタイルよりもはるかに高速であるため、@Beans (または @EnableAutoConfiguration)が必要ない場合は、これを選択することをお勧めします。ウォームスタートは影響を受けません。