🐰

【Azure Functions × App Configuration × SpringBoot】Spring Profileの切り替え

2022/12/16に公開

SpringBootのWebアプリケーションでProfileを切り替える場合、JVM起動オプションで切り替える方式を採用していたんですが、どこで設定すればいいのかわからなかったので、とりあえず動いた方法を書いておきます。

環境

  • Windows11
  • SpringBoot 2.7.6
  • Java 11
  • Gradle
  • VSCode

Azure Functions

ローカル起動

./gradlew azureFunctionsRun

上記コマンドで起動しますが、ここでspring.profiles.activeを渡して上げてもうまくいかないので、Gradle TaskのlocalDebugにJVMオプションとして渡してあげます。
LocalRunTask

build.gradle
azurefunctions {
	subscription = '[subscription-id]'
	resourceGroup = '[resourceGroup]'
	appName = '[appName]'
	pricingTier = 'B2'
	region = 'japaneast'
	runtime {
		os = 'linux'
	}
	appSettings {
		WEBSITE_RUN_FROM_PACKAGE = '1'
    	FUNCTIONS_EXTENSION_VERSION = '~4'
    	FUNCTIONS_WORKER_RUNTIME = 'java'
    	MAIN_CLASS = 'com.example.demo.DemoApplication'
	}
	auth {
		type = 'azure_cli'
	}
	localDebug = "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Dspring.profiles.active=localdev"
	deployment {
		type = 'run_from_blob'
	}
}

起動

[2022-12-16T04:14:23.558Z]   .   ____          _            __ _ _
[2022-12-16T04:14:23.558Z]  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
[2022-12-16T04:14:23.558Z] ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
[2022-12-16T04:14:23.558Z]  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
[2022-12-16T04:14:23.558Z]   '  |____| .__|_| |_|_| |_\__, | / / / /
[2022-12-16T04:14:23.558Z]  =========|_|==============|___/=/_/_/_/
[2022-12-16T04:14:23.558Z]  :: Spring Boot ::                (v2.7.6)
[2022-12-16T04:14:23.567Z] 2022-12-16 13:14:23.566  INFO 23856 --- [pool-2-thread-1] o.s.boot.SpringApplication               : The following 3 profiles are active: "localdev", "common", "local"

Functions 環境

デフォルトで『azure』が指定されているので、デフォルトの指定で読み込みが走ります。

2022-12-16T02:10:34Z   [Information]     .   ____          _            __ _ _
2022-12-16T02:10:34Z   [Information]    /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
2022-12-16T02:10:34Z   [Information]   ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
2022-12-16T02:10:34Z   [Information]    \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
2022-12-16T02:10:34Z   [Information]     '  |____| .__|_| |_|_| |_\__, | / / / /
2022-12-16T02:10:34Z   [Information]    =========|_|==============|___/=/_/_/_/
2022-12-16T02:10:34Z   [Information]    :: Spring Boot ::                (v2.7.6)
2022-12-16T02:10:34Z   [Information]   2022-12-16 11:10:34.197  INFO 49 --- [pool-2-thread-2] c.a.c.i.jackson.JacksonVersion           : Package versions: jackson-core=2.13.4, jackson-databind=2.13.4-2, jackson-dataformat-xml=2.13.4, jackson-datatype-jsr310=2.13.4, azure-core=1.34.0, Troubleshooting version conflicts: https://aka.ms/azsdk/java/dependency/troubleshoot
2022-12-16T02:10:40Z   [Information]   2022-12-16 11:10:39.627  INFO 49 --- [pool-2-thread-2] o.s.boot.SpringApplication               : The following 2 profiles are active: "azure", "common"

ローカル単体テスト環境

通常だと @ActiveProfiles("test") でプロファイルの指定ができるんですけど、イマイチ効かなかったので、単体実行時の起動オプションに追加します。
(よく考えたらSpringBootTestとかじゃないので効かないのか?)
VSCode だとsettings.json に指定します。あとは通常通りポチッと押していくだけです。

settings.json
	"java.test.config": {
		"name": "with spring profile test",
		"vmArgs": [
			"-Dspring.profiles.active=test"
		]
	}

(おまけ)AppService の場合

AppServiceだとこれでいけます。
アプリケーション設定でJAVA_OPTSを設定するのを忘れずに。

ファイル構成

src/main/resources
src/test/resources

YAMLファイル

  • application.yml
    • application-common.yml, application-local.yml はそれぞれプロパティを書いてく。
application.yml
spring:
  profiles:
    group:
      localdev:
        - common
        - local
      azure:
        - common
      default: localdev
  • bootstrap.yml
    • ちなみにマネージドIDを使った書き方
    • bootstrap-common.yml という名前じゃないのはプロファイルの参照順の関係で読まれなくなってしまったからだったような(今ならできるかも?)
bootstrap.yml
# Use default application name and no profile configured
# Keys starting with /application/ will be matched
spring:
  cloud:
    azure:
      appconfiguration:
        managed-identity:
          client-id: ${APP_CONFIGURATION_MANAGED_IDENTITY_CLIENT_ID}
        stores:
          - endpoint: ${APP_CONFIGURATION_ENDPOINT}
  • ローカル/テストからは接続できないのでOFFの設定
bootstrap-local.yml,bootstrap-test.yml
spring:
  cloud:
    azure:
      appconfiguration:
        enabled: false

あとがき

またFunctionsをいろいろ触っていくとわかっていくとは思うけど、現時点で動くのはこの設定ということで。
Functions×Java×SpringBootはいろいろ罠が多くて辛いところなので、またまとめたいことがあれば都度まとめていきます(多分)

Discussion