🐰
【Azure Functions × App Configuration × SpringBoot】Spring Profileの切り替え
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を設定するのを忘れずに。
ファイル構成
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