チュートリアル: Azure Container Apps でマネージド Gateway for Spring に接続する (プレビュー)
Gateway for Spring は、API 要求をマイクロサービス アーキテクチャの一部としてルーティング、管理、処理するための効率的で強力な方法を提供します。 外部要求をさまざまなサービスにルーティングする API ゲートウェイとして機能し、フィルター処理、負荷分散などのさまざまな機能を追加します。 この記事では、コンテナー アプリに要求を送信するゲートウェイを作成する方法について説明します。
このチュートリアルで学習する内容は次のとおりです。
- Gateway for Spring Java コンポーネントを作成する
- コンテナー アプリに要求をリダイレクトするためのカスタム ルートを使用して Gateway for Springを更新する
重要
このチュートリアルでは、Azure の請求書に影響する可能性のあるサービスを使用します。 手順に従う場合は、予期しない課金を回避するために、この記事で紹介されているリソースを必ず削除してください。
前提条件
考慮事項
Azure Container Apps の Gateway for Spring で実行する場合は、次の詳細に注意してください。
項目 | 説明 |
---|---|
スコープ | Gateway for Spring は、接続されているコンテナー アプリと同じ環境で実行されます。 |
リソース | Gateway for Spring のコンテナー リソース割り当ては固定されており、CPU コア数は 0.5、メモリ サイズは 1Gi です。 |
Pricing | Gateway for Spring の課金は消費ベースの価格に該当します。 マネージド Java コンポーネントによって消費されるリソースは、アクティブ/アイドル レートで課金されます。 課金を停止するために、使用しなくなったコンポーネントを削除できます。 |
セットアップ
Gateway for Spring の操作を開始する前に、まず、必要なリソースを作成する必要があります。
次のコマンドを実行して、リソース グループと Container Apps 環境を作成します。
アプリケーション構成をサポートする変数を作成します。 これらの値は、このレッスンのために提供されています。 このレッスンでは、Spring サンプル アプリの管理者のアクチュエータ エンドポイントを使用します。
export LOCATION=eastus export RESOURCE_GROUP=my-spring-cloud-resource-group export ENVIRONMENT=my-spring-cloud-environment export JAVA_COMPONENT_NAME=mygateway export APP_NAME=myapp export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-admin-for-spring-client:latest"
Variable 説明 LOCATION
コンテナー アプリと Java コンポーネントを作成する Azure リージョンの場所。 ENVIRONMENT
デモ アプリケーションの Azure Container Apps 環境名。 RESOURCE_GROUP
デモ アプリケーションの Azure リソース グループ名。 JAVA_COMPONENT_NAME
コンテナー アプリ用に作成された Java コンポーネントの名前。 この場合は、Gateway for Spring Java コンポーネントを作成します。 IMAGE
コンテナー アプリで使用されるコンテナー イメージ。 Azure CLI を使用して Azure にログインします。
az login
リソース グループを作成する。
az group create --name $RESOURCE_GROUP --location $LOCATION
コンテナー アプリ環境を作成します。
az containerapp env create \ --name $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --location $LOCATION
この環境は、Gateway for Spring コンポーネントとコンテナー アプリの両方をホストするために使用されます。
Gateway for Spring Java コンポーネントを使用する
Container Apps 環境ができたので、コンテナー アプリを作成し、Gateway for Spring Java コンポーネントを使ってそれに要求をリダイレクトできます。
Gateway for Spring Java コンポーネントを作成します。
az containerapp env java-component gateway-for-spring create \ --environment $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --name $JAVA_COMPONENT_NAME \
完全修飾ドメイン名 (FQDN) を持つコンテナー アプリを作成します。
az containerapp create \ --name $APP_NAME \ --resource-group $RESOURCE_GROUP \ --environment $ENVIRONMENT \ --image $IMAGE \ --ingress external \ --target-port 8080 \ --query properties.configuration.ingress.fqdn
このコマンドは、構成データを消費するコンテナー アプリの URL を返します。 URL をテキスト エディターにコピーし、次の手順で使用できるようにします。
要求をルーティングするためにゲートウェイ ルートを更新する
次のコンテンツを含む YAML ファイルを作成します。
<MYAPP_URL>
を、前のステップのコンテナー アプリの FQDN に置き換えます。springCloudGatewayRoutes: - id: "route1" uri: "<MYAPP_URL>" predicates: - "Path=/myapp/{path}" filters: - "SetPath=/actuator/{path}"
次のコマンドを実行して、ルート構成を使用して Gateway for Spring Java コンポーネントを更新します。
az containerapp env java-component gateway-for-spring update \ --environment $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --name $JAVA_COMPONENT_NAME \ --route-yaml <PTAH_TO_ROUTE_YAML_FILE> \ --query properties.ingress.fqdn
このコマンドは、ゲートウェイ ルートを更新し、構成データを使用するゲートウェイの URL を返します。
このコマンドは、ゲートウェイの URL を返します。 パス
/myapp/health
でこの URL にアクセスすると、要求がアプリのactuator/health
エンドポイントにルーティングされ、{"status":"UP","groups":["liveness","readiness"]}
が返されます。
リソースをクリーンアップする
このチュートリアルで作成したリソースは、Azure の請求書に影響します。 これらのサービスを長期間使用しない場合は、次のコマンドを実行して、このチュートリアルで作成したすべてのものを削除してください。
az group delete --resource-group $RESOURCE_GROUP
ルート ファイル形式
Gateway for Spring コンポーネントは、ID、URI、述語、フィルターを持つプロパティを使用したルートの定義をサポートしています。 詳細については、「Spring Cloud Gateway ドキュメント」を参照してください。 これらのプロパティを構成する方法を示す YAML ファイルの例を次に示します。
springCloudGatewayRoutes:
- id: "route1"
uri: "https://otherjavacomponent.myenvironment.test.net"
predicates:
- "Path=/v1/{path}"
- "After=2024-01-01T00:00:00.000-00:00[America/Denver]"
filters:
- "SetPath=/{path}"
- id: "route2"
uri: "https://otherjavacomponent.myenvironment.test.net"
predicates:
- "Path=/v2/{path}"
- "After=2024-01-01T00:00:00.000-00:00[America/Denver]"
filters:
- "SetPath=/{path}"
Gateway for Spring で許可されている構成リスト (#configurable-properties)
次の表では、アプリ用に構成できるゲートウェイ コンポーネントのプロパティについて説明します。 詳細については、「Spring Cloud Gateway の一般的なアプリケーションのプロパティ」を参照してください。
プロパティ名 | 説明 | 規定値 |
---|---|---|
spring.cloud.gateway.default-filters |
すべてのルートに適用されるフィルター定義のリスト。 | |
spring.cloud.gateway.enabled |
ゲートウェイの機能を有効にします。 | true |
spring.cloud.gateway.fail-on-route-definition-error |
ルート定義エラーで失敗するオプション。既定値は true です。 それ以外の場合は、警告がログに記録されます。 | true |
spring.cloud.gateway.handler-mapping.order |
RoutePredicateHandlerMapping の順序。 |
1 |
spring.cloud.gateway.loadbalancer.use404 |
false |
|
spring.cloud.gateway.discovery.locator.enabled |
DiscoveryClient ゲートウェイ統合を有効にするフラグ。 |
false |
spring.cloud.gateway.discovery.locator.filters |
||
spring.cloud.gateway.discovery.locator.include-expression |
ゲートウェイ統合にサービスを含めるかどうかを評価する SpEL 式。 既定値は true です。 |
true |
spring.cloud.gateway.discovery.locator.lower-case-service-id |
述語とフィルターで serviceId を小文字にするオプション。 既定値は false です。 Eureka で serviceId が自動的に大文字になる場合に便利です。 したがって、MYSERVICE は /myservice/** と一致します |
false |
spring.cloud.gateway.discovery.locator.predicates |
||
spring.cloud.gateway.discovery.locator.route-id-prefix |
routeId のプレフィックスは、既定で discoveryClient.getClass().getSimpleName() + "_" です。 routeId を作成するためにサービス ID が追加されます。 |
|
spring.cloud.gateway.discovery.locator.url-expression |
各ルートの URI を作成する SpEL 式。 既定値は 'lb://'+serviceId です。 |
'lb://'+serviceId |
spring.cloud.gateway.filter.add-request-header.enabled |
add-request-header フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.add-request-parameter.enabled |
add-request-parameter フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.add-response-header.enabled |
add-response-header フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.circuit-breaker.enabled |
circuit-breaker フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.dedupe-response-header.enabled |
dedupe-response-header フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.fallback-headers.enabled |
fallback-headers フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.hystrix.enabled |
hystrix フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.json-to-grpc.enabled |
gRPC フィルターに対して JSON を有効にします。 | true |
spring.cloud.gateway.filter.local-response-cache.enabled |
local-response-cache フィルターを有効にします。 |
false |
spring.cloud.gateway.filter.local-response-cache.request.no-cache-strategy |
||
spring.cloud.gateway.filter.local-response-cache.size |
このルートのエントリを削除するキャッシュの最大サイズ (KB、MB、GB)。 | |
spring.cloud.gateway.filter.local-response-cache.time-to-live |
キャッシュ エントリの有効期限が切れるまでの時間 (秒単位は s 、分単位は m 、時間単位は h で表現)。 |
5m |
spring.cloud.gateway.filter.map-request-header.enabled |
map-request-header フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.modify-request-body.enabled |
modify-request-body フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.modify-response-body.enabled |
modify-response-body フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.prefix-path.enabled |
prefix-path フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.preserve-host-header.enabled |
preserve-host-header フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.redirect-to.enabled |
redirect-to フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.remove-hop-by-hop.headers |
||
spring.cloud.gateway.filter.remove-hop-by-hop.order |
0 |
|
spring.cloud.gateway.filter.remove-request-header.enabled |
remove-request-header フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.remove-request-parameter.enabled |
remove-request-parameter フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.remove-response-header.enabled |
remove-response-header フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.request-header-size.enabled |
request-header-size フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.request-header-to-request-uri.enabled |
request-header-to-request-uri フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.request-rate-limiter.default-key-resolver |
||
spring.cloud.gateway.filter.request-rate-limiter.default-rate-limiter |
||
spring.cloud.gateway.filter.request-rate-limiter.enabled |
request-rate-limiter フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.request-size.enabled |
request-size フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.retry.enabled |
retry フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.rewrite-location-response-header.enabled |
rewrite-location-response-header フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.rewrite-location.enabled |
rewrite-location フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.rewrite-path.enabled |
rewrite-path フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.rewrite-request-parameter.enabled |
rewrite-request-parameter フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.rewrite-response-header.enabled |
rewrite-response-header フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.save-session.enabled |
save-session フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.secure-headers.content-security-policy |
default-src 'self' https:; font-src 'self' https: data:; img-src 'self' https: data:; object-src 'none'; script-src https:; style-src 'self' https: 'unsafe-inline' |
|
spring.cloud.gateway.filter.secure-headers.content-type-options |
nosniff |
|
spring.cloud.gateway.filter.secure-headers.disable |
||
spring.cloud.gateway.filter.secure-headers.download-options |
noopen |
|
spring.cloud.gateway.filter.secure-headers.enabled |
secure-headers フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.secure-headers.frame-options |
DENY |
|
spring.cloud.gateway.filter.secure-headers.permitted-cross-domain-policies |
none |
|
spring.cloud.gateway.filter.secure-headers.referrer-policy |
no-referrer |
|
spring.cloud.gateway.filter.secure-headers.strict-transport-security |
max-age=631138519 |
|
spring.cloud.gateway.filter.secure-headers.xss-protection-header |
1 ; mode=block |
|
spring.cloud.gateway.filter.set-path.enabled |
set-path フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.set-request-header.enabled |
set-request-header フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.set-request-host-header.enabled |
set-request-host-header フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.set-response-header.enabled |
set-response-header フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.set-status.enabled |
set-status フィルターを有効にします。 |
true |
spring.cloud.gateway.filter.strip-prefix.enabled |
strip-prefix フィルターを有効にします。 |
true |
spring.cloud.gateway.forwarded.enabled |
ForwardedHeadersFilter を有効にします。 |
true |
spring.cloud.gateway.global-filter.adapt-cached-body.enabled |
adapt-cached-body グローバル フィルターを有効にします。 |
true |
spring.cloud.gateway.global-filter.forward-path.enabled |
forward-path グローバル フィルターを有効にします。 |
true |
spring.cloud.gateway.global-filter.forward-routing.enabled |
forward-routing グローバル フィルターを有効にします。 |
true |
spring.cloud.gateway.global-filter.load-balancer-client.enabled |
load-balancer-client グローバル フィルターを有効にします。 |
true |
spring.cloud.gateway.global-filter.local-response-cache.enabled |
すべてのルートの local-response-cache フィルターを有効にします。これにより、LocalResponseCache フィルターを使用してルート レベルで特定の構成を追加できるようになります。 |
true |
spring.cloud.gateway.global-filter.netty-routing.enabled |
netty-routing global フィルターを有効にします。 |
true |
spring.cloud.gateway.global-filter.netty-write-response.enabled |
netty-write-response グローバル フィルターを有効にします。 |
true |
spring.cloud.gateway.global-filter.reactive-load-balancer-client.enabled |
reactive-load-balancer-client グローバル フィルターを有効にします。 |
true |
spring.cloud.gateway.global-filter.remove-cached-body.enabled |
remove-cached-body グローバル フィルターを有効にします。 |
true |
spring.cloud.gateway.global-filter.route-to-request-url.enabled |
route-to-request-url グローバル フィルターを有効にします。 |
true |
spring.cloud.gateway.global-filter.websocket-routing.enabled |
websocket-routing グローバル フィルターを有効にします。 |
true |
spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping |
グローバル CORS 構成を URL ハンドラーに追加する必要がある場合。 | false |
spring.cloud.gateway.globalcors.cors-configurations |
||
spring.cloud.gateway.redis-rate-limiter.burst-capacity-header |
バースト容量構成を返すヘッダーの名前。 | X-RateLimit-Burst-Capacity |
spring.cloud.gateway.redis-rate-limiter.config |
||
spring.cloud.gateway.redis-rate-limiter.include-headers |
レート リミッター情報を含むヘッダーを含めるかどうか。 既定値は true です。 |
true |
spring.cloud.gateway.redis-rate-limiter.remaining-header |
現在の秒の間に残りの要求の数を返すヘッダーの名前。 | X-RateLimit-Remaining |
spring.cloud.gateway.redis-rate-limiter.replenish-rate-header |
補充レート構成を返すヘッダーの名前。 | X-RateLimit-Replenish-Rate |
spring.cloud.gateway.redis-rate-limiter.requested-tokens-header |
要求されたトークン構成を返すヘッダーの名前。 | X-RateLimit-Requested-Tokens |
spring.cloud.gateway.restrictive-property-accessor.enabled |
SpEL 内のメソッドとプロパティ アクセスを制限します。 | true |
spring.cloud.gateway.predicate.after.enabled |
after 述語を有効にします。 |
true |
spring.cloud.gateway.predicate.before.enabled |
before 述語を有効にします。 |
true |
spring.cloud.gateway.predicate.between.enabled |
between 述語を有効にします。 |
true |
spring.cloud.gateway.predicate.cloud-foundry-route-service.enabled |
cloud-foundry-route-service 述語を有効にします。 |
true |
spring.cloud.gateway.predicate.cookie.enabled |
cookie 述語を有効にします。 |
true |
spring.cloud.gateway.predicate.header.enabled |
header 述語を有効にします。 |
true |
spring.cloud.gateway.predicate.host.enabled |
host 述語を有効にします。 |
true |
spring.cloud.gateway.predicate.host.include-port |
ホスト名の照合にポートを含めます。 | true |
spring.cloud.gateway.predicate.method.enabled |
method 述語を有効にします。 |
true |
spring.cloud.gateway.predicate.path.enabled |
path 述語を有効にします。 |
true |
spring.cloud.gateway.predicate.query.enabled |
query 述語を有効にします。 |
true |
spring.cloud.gateway.predicate.read-body.enabled |
read-body 述語を有効にします。 |
true |
spring.cloud.gateway.predicate.remote-addr.enabled |
remote-addr 述語を有効にします。 |
true |
spring.cloud.gateway.predicate.weight.enabled |
weight 述語を有効にします。 |
true |
spring.cloud.gateway.predicate.xforwarded-remote-addr.enabled |
xforwarded-remote-addr 述語を有効にします。 |
true |
spring.cloud.gateway.set-status.original-status-header-name |
プロキシ処理された要求の HTTP コードを含むヘッダーの名前。 | |
spring.cloud.gateway.streaming-media-types |
||
spring.cloud.gateway.x-forwarded.enabled |
XForwardedHeadersFilter が有効である場合: |
true |
spring.cloud.gateway.x-forwarded.for-append |
リストとしての X-Forwarded-For の追加が有効である場合。 |
true |
spring.cloud.gateway.x-forwarded.for-enabled |
X-Forwarded-For が有効である場合: |
true |
spring.cloud.gateway.x-forwarded.host-append |
リストとしての X-Forwarded-Host の追加が有効である場合。 |
true |
spring.cloud.gateway.x-forwarded.host-enabled |
X-Forwarded-Host が有効である場合: |
true |
spring.cloud.gateway.x-forwarded.order |
XForwardedHeadersFilter の順序。 |
0 |
spring.cloud.gateway.x-forwarded.port-append |
リストとしての X-Forwarded-Port の追加が有効である場合。 |
true |
spring.cloud.gateway.x-forwarded.port-enabled |
X-Forwarded-Port が有効である場合: |
true |
spring.cloud.gateway.x-forwarded.prefix-append |
リストとしての X-Forwarded-Prefix の追加が有効である場合。 |
true |
spring.cloud.gateway.x-forwarded.prefix-enabled |
X-Forwarded-Prefix が有効である場合: |
true |
spring.cloud.gateway.x-forwarded.proto-append |
リストとしての X-Forwarded-Proto の追加が有効である場合。 |
true |
spring.cloud.gateway.x-forwarded.proto-enabled |
X-Forwarded-Proto が有効である場合: |
true |
spring.cloud.gateway.httpclient.compression |
Netty HttpClient の圧縮を有効にします。 |
false |
spring.cloud.gateway.httpclient.connect-timeout |
接続タイムアウト (ミリ秒単位)。 既定値は 30s です。 |
|
spring.cloud.gateway.httpclient.max-header-size |
応答ヘッダーの最大サイズ。 | |
spring.cloud.gateway.httpclient.max-initial-line-length |
先頭行の最大長。 | |
spring.cloud.gateway.httpclient.pool.acquire-timeout |
FIXED 型の場合のみ、取得を待機する最大時間 (ミリ秒単位)。 |
|
spring.cloud.gateway.httpclient.pool.eviction-interval |
指定された間隔でバックグラウンドで定期的な削除チェックを実行します。 既定で無効 ({@link Duration#ZERO} )。 |
0 |
spring.cloud.gateway.httpclient.pool.max-connections |
FIXED 型の場合のみ、既存の接続で保留中の取得を開始する前の接続の最大数。 | |
spring.cloud.gateway.httpclient.pool.max-idle-time |
チャネルが閉じられるまでの時間 (ミリ秒単位)。 NULL である場合、最大アイドル時間はありません。 |
|
spring.cloud.gateway.httpclient.pool.max-life-time |
チャネルが閉じられるまでの時間。 NULL である場合、最大有効時間はありません。 |
|
spring.cloud.gateway.httpclient.pool.metrics |
チャネル プールメトリックを収集して Micrometer に登録できるようにします。 既定で無効になっています。 | false |
spring.cloud.gateway.httpclient.pool.name |
チャネル プールのマップ名。既定値はプロキシです。 | proxy |
spring.cloud.gateway.httpclient.pool.type |
使用する HttpClient のプールの種類。既定値は ELASTIC です。 |
|
spring.cloud.gateway.httpclient.response-timeout |
応答のタイムアウト。 | |
spring.cloud.gateway.httpclient.ssl.close-notify-flush-timeout |
SSL close_notify のフラッシュ タイムアウト。 既定値 3000 ms 。 |
3000ms |
spring.cloud.gateway.httpclient.ssl.close-notify-read-timeout |
SSL close_notify 読み取りタイムアウト。 既定値は 0 ms です。 |
0 |
spring.cloud.gateway.httpclient.ssl.handshake-timeout |
SSL ハンドシェイク タイムアウト。 既定値は 10000 ms. |
10000ms |
spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager |
netty InsecureTrustManagerFactory をインストールします。 これは安全ではなく、運用環境には適していません。 |
false |
spring.cloud.gateway.httpclient.websocket.max-frame-payload-length |
フレーム ペイロードの最大長。 | |
spring.cloud.gateway.httpclient.websocket.proxy-ping |
ダウンストリーム サービスに対するプロキシ ping フレーム。 既定値は true です。 |
true |
spring.cloud.gateway.httpclient.wiretap |
Netty HttpClient の傍受デバッグを有効にします。 |
false |
spring.cloud.gateway.httpserver.wiretap |
Netty HttpServer の傍受デバッグを有効にします。 |
false |
spring.cloud.gateway.metrics.enabled |
メトリック データのコレクションを有効にします。 | false |
spring.cloud.gateway.metrics.prefix |
ゲートウェイによって出力されるすべてのメトリックのプレフィックス。 | spring.cloud.gateway |
spring.cloud.gateway.metrics.tags |
メトリックに追加されたタグ マップ。 | |
spring.cloud.gateway.observability.enabled |
Micrometer 監視のサポートを有効にする必要がある場合。 | true |
一般的な構成
次のリストは、一般的な構成を示しています。
- ログ関連の構成:
logging.level.*
logging.group.*
logging.*
名前空間のその他の構成は禁止にする必要があります。 たとえば、logging.file
を使用したログ ファイルの書き込みは禁止する必要があります。