跳至主要内容

Spring Cloud AWS Secrets Manager 即使選用也得指定區域的擾人錯誤

· 閱讀時間約 9 分鐘

最近嘗試使用 Spring Cloud Config 的時候遇到了一個預料之外的錯誤,完整內容有點長,就放到底下吧。

即便沒有用上 Spring Cloud AWS Secrets Manager 相關功能,只要沒有指定 region 就會噴錯,尤其是已經指定非必須 (optional) 載入相關設定依然會發生。

查找了下得到幾個迂迴的作法,可以指定區域,但這顯得有點蠢,也可以將相關功能給關閉,需要自己主動做這件事也是有點不爽,但現在暫時只能這麼做了。

關閉功能的 property:

spring.cloud.aws.secretsmanager.enabled=false

另外有其他專案確實有直接使用到 Spring Cloud AWS Secrets Manager,只有本機在情況下使用,其他環境不使用,就沒有以任何方式指定 region,先前使用 3.0.0 版的時候是沒有問題的,後來更新到 3.4.1 和 3.4.2 就遇上同樣問題了。

看起來是若干年前就曾經出現過的問題,後來有修好但是這幾版又復發…

參考連結

錯誤訊息

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2025-12-19T06:05:50.574Z ERROR 1 --- [thunderstruck] [ main] o.s.boot.SpringApplication : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'secretsManagerClient' defined in class path resource [io/awspring/cloud/autoconfigure/config/secretsmanager/SecretsManagerAutoConfiguration.class]: Failed to instantiate [software.amazon.awssdk.services.secretsmanager.SecretsManagerClient]: Factory method 'secretsManagerClient' threw exception with message: Unable to load region from any of the providers in the chain software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain@19369afb: [software.amazon.awssdk.regions.providers.SystemSettingsRegionProvider@5adfa95c: Unable to load region from system settings. Region must be specified either via environment variable (AWS_REGION) or system property (aws.region)., software.amazon.awssdk.regions.providers.AwsProfileRegionProvider@54c15b15: No region provided in profile: default, software.amazon.awssdk.regions.providers.InstanceProfileRegionProvider@1bb8de48: Unable to contact EC2 metadata service.]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:645) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1375) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1205) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:569) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1228) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1194) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1130) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:990) ~[spring-context-6.2.14.jar:6.2.14]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) ~[spring-context-6.2.14.jar:6.2.14]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.5.8.jar:3.5.8]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.5.8.jar:3.5.8]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.5.8.jar:3.5.8]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.5.8.jar:3.5.8]
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:194) ~[spring-boot-3.5.8.jar:3.5.8]
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:174) ~[spring-boot-3.5.8.jar:3.5.8]
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:102) ~[spring-boot-3.5.8.jar:3.5.8]
at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:171) ~[spring-web-6.2.14.jar:6.2.14]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4416) ~[catalina.jar:11.0.14]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:564) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:650) ~[catalina.jar:11.0.14]
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:923) ~[catalina.jar:11.0.14]
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1839) ~[catalina.jar:11.0.14]
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:545) ~[na:na]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328) ~[na:na]
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:81) ~[tomcat-util.jar:11.0.14]
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:125) ~[na:na]
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:727) ~[catalina.jar:11.0.14]
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:378) ~[catalina.jar:11.0.14]
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1579) ~[catalina.jar:11.0.14]
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:262) ~[catalina.jar:11.0.14]
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109) ~[catalina.jar:11.0.14]
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:389) ~[catalina.jar:11.0.14]
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:336) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:741) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:767) ~[catalina.jar:11.0.14]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1162) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1158) ~[catalina.jar:11.0.14]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328) ~[na:na]
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:81) ~[tomcat-util.jar:11.0.14]
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:149) ~[na:na]
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:714) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:201) ~[catalina.jar:11.0.14]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:410) ~[catalina.jar:11.0.14]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ~[catalina.jar:11.0.14]
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:864) ~[catalina.jar:11.0.14]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ~[catalina.jar:11.0.14]
at org.apache.catalina.startup.Catalina.start(Catalina.java:756) ~[catalina.jar:11.0.14]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:565) ~[na:na]
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:339) ~[bootstrap.jar:11.0.14]
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:470) ~[bootstrap.jar:11.0.14]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [software.amazon.awssdk.services.secretsmanager.SecretsManagerClient]: Factory method 'secretsManagerClient' threw exception with message: Unable to load region from any of the providers in the chain software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain@19369afb: [software.amazon.awssdk.regions.providers.SystemSettingsRegionProvider@5adfa95c: Unable to load region from system settings. Region must be specified either via environment variable (AWS_REGION) or system property (aws.region)., software.amazon.awssdk.regions.providers.AwsProfileRegionProvider@54c15b15: No region provided in profile: default, software.amazon.awssdk.regions.providers.InstanceProfileRegionProvider@1bb8de48: Unable to contact EC2 metadata service.]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:200) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiateWithFactoryMethod(SimpleInstantiationStrategy.java:89) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:169) ~[spring-beans-6.2.14.jar:6.2.14]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-6.2.14.jar:6.2.14]
... 59 common frames omitted
Caused by: software.amazon.awssdk.core.exception.SdkClientException: Unable to load region from any of the providers in the chain software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain@19369afb: [software.amazon.awssdk.regions.providers.SystemSettingsRegionProvider@5adfa95c: Unable to load region from system settings. Region must be specified either via environment variable (AWS_REGION) or system property (aws.region)., software.amazon.awssdk.regions.providers.AwsProfileRegionProvider@54c15b15: No region provided in profile: default, software.amazon.awssdk.regions.providers.InstanceProfileRegionProvider@1bb8de48: Unable to contact EC2 metadata service.]
at software.amazon.awssdk.core.exception.SdkClientException$BuilderImpl.build(SdkClientException.java:130) ~[sdk-core-2.31.78.jar:na]
at software.amazon.awssdk.regions.providers.AwsRegionProviderChain.getRegion(AwsRegionProviderChain.java:70) ~[regions-2.31.78.jar:na]
at io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.resolveRegion(AwsClientBuilderConfigurer.java:181) ~[spring-cloud-aws-autoconfigure-3.4.1.jar:3.4.1]
at io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.resolveRegion(AwsClientBuilderConfigurer.java:168) ~[spring-cloud-aws-autoconfigure-3.4.1.jar:3.4.1]
at io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.configure(AwsClientBuilderConfigurer.java:86) ~[spring-cloud-aws-autoconfigure-3.4.1.jar:3.4.1]
at io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.configureSyncClient(AwsClientBuilderConfigurer.java:140) ~[spring-cloud-aws-autoconfigure-3.4.1.jar:3.4.1]
at io.awspring.cloud.autoconfigure.config.secretsmanager.SecretsManagerAutoConfiguration.secretsManagerClient(SecretsManagerAutoConfiguration.java:55) ~[spring-cloud-aws-autoconfigure-3.4.1.jar:3.4.1]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:565) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:172) ~[spring-beans-6.2.14.jar:6.2.14]
... 62 common frames omitted

19-Dec-2025 06:05:50.578 SEVERE [main] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive [/usr/local/tomcat/webapps/ROOT.war]
java.lang.IllegalStateException: Error starting child
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:567)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:650)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:923)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1839)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:545)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328)
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:81)
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:125)
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:727)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:378)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1579)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:262)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109)
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:389)
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:336)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:741)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:767)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1162)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1158)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:328)
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:81)
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:149)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:714)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:201)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:410)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:864)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
at org.apache.catalina.startup.Catalina.start(Catalina.java:756)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:565)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:339)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:470)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:404)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:179)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:564)
... 34 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'secretsManagerClient' defined in class path resource [io/awspring/cloud/autoconfigure/config/secretsmanager/SecretsManagerAutoConfiguration.class]: Failed to instantiate [software.amazon.awssdk.services.secretsmanager.SecretsManagerClient]: Factory method 'secretsManagerClient' threw exception with message: Unable to load region from any of the providers in the chain software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain@19369afb: [software.amazon.awssdk.regions.providers.SystemSettingsRegionProvider@5adfa95c: Unable to load region from system settings. Region must be specified either via environment variable (AWS_REGION) or system property (aws.region)., software.amazon.awssdk.regions.providers.AwsProfileRegionProvider@54c15b15: No region provided in profile: default, software.amazon.awssdk.regions.providers.InstanceProfileRegionProvider@1bb8de48: Unable to contact EC2 metadata service.]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:645)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1375)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1205)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:569)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1228)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1130)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:990)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:318)
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:194)
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:174)
at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:102)
at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:171)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4416)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
... 35 more
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [software.amazon.awssdk.services.secretsmanager.SecretsManagerClient]: Factory method 'secretsManagerClient' threw exception with message: Unable to load region from any of the providers in the chain software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain@19369afb: [software.amazon.awssdk.regions.providers.SystemSettingsRegionProvider@5adfa95c: Unable to load region from system settings. Region must be specified either via environment variable (AWS_REGION) or system property (aws.region)., software.amazon.awssdk.regions.providers.AwsProfileRegionProvider@54c15b15: No region provided in profile: default, software.amazon.awssdk.regions.providers.InstanceProfileRegionProvider@1bb8de48: Unable to contact EC2 metadata service.]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:200)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiateWithFactoryMethod(SimpleInstantiationStrategy.java:89)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:169)
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653)
... 59 more
Caused by: software.amazon.awssdk.core.exception.SdkClientException: Unable to load region from any of the providers in the chain software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain@19369afb: [software.amazon.awssdk.regions.providers.SystemSettingsRegionProvider@5adfa95c: Unable to load region from system settings. Region must be specified either via environment variable (AWS_REGION) or system property (aws.region)., software.amazon.awssdk.regions.providers.AwsProfileRegionProvider@54c15b15: No region provided in profile: default, software.amazon.awssdk.regions.providers.InstanceProfileRegionProvider@1bb8de48: Unable to contact EC2 metadata service.]
at software.amazon.awssdk.core.exception.SdkClientException$BuilderImpl.build(SdkClientException.java:130)
at software.amazon.awssdk.regions.providers.AwsRegionProviderChain.getRegion(AwsRegionProviderChain.java:70)
at io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.resolveRegion(AwsClientBuilderConfigurer.java:181)
at io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.resolveRegion(AwsClientBuilderConfigurer.java:168)
at io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.configure(AwsClientBuilderConfigurer.java:86)
at io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.configureSyncClient(AwsClientBuilderConfigurer.java:140)
at io.awspring.cloud.autoconfigure.config.secretsmanager.SecretsManagerAutoConfiguration.secretsManagerClient(SecretsManagerAutoConfiguration.java:55)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:565)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:172)
... 62 more
19-Dec-2025 06:05:50.581 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/ROOT.war] has finished in [8,138] ms

60% 鍵盤主力一段時間後的小小心得

· 閱讀時間約 1 分鐘

60% 鍵盤用了一陣子,整體來說還是不比 75% 來得有效率,不過讓我終於嘗試替換掉 Caps Lock 以後得到了一個不錯的心得,把 Caps Lock 換成 Fn 再搭配周圍的按鍵設成第二組方向鍵跟六塊肌,還沒用到成為肌肉記憶,不過可以讓我不必把手移開,挺不賴,再花點時間適應。

keyboard fn2 layout

極力反推 <Shipgo17 世購國際> 集運服務

· 閱讀時間約 3 分鐘

前言

從一路發逃難出來前用了好長一段時間,而且算得上頻繁吧,也是逃得很晚了。

後來隨便找了 Shipgo17,起初只覺得怎麼網頁那麼垃圾,委託收貨要填那麼多有的沒的完全不知道意義在哪裡,申請寄回也難用到爆炸,費用上沒有比較便宜,速度又慢。

唯一好處大概就是客服態度還算可以吧,但是回覆速度也很慢。

光上述部份就已經夠糟的,更扯的是後來有遇到幾個實在是極為要不得的狀況。

日本站 - 包裏遺漏運回

首先是包裏漏寄回,因為這種服務用很習慣了,頻率高加上一次運回的量也不少,後來基於信任就沒有特別清點,當然這也說明我自己買了啥都沒放心上… 夠蠢的。

後來有一次又運回了一大包,有覺得怪怪的並沒有多想,過了大概一個月,才接到客服通知說整理倉庫發現有東西當初沒打包到寄回來給我,當初整併沒包到所以也沒算到錢。

我當然是要寄回,其實感覺非常差,不過至少還算誠實,所以我也沒特別怎樣,但很確定該放棄這家了。

所以後來經學長推薦改用運匠,體驗真的良好許多,速度快,網頁雖說偏簡陋,但 UX 真的像是正常東西太多了,缺點的話則是國家站點較少,只有日本和支那。

美國站 - 主動催問才會入庫,包裏遺失近兩個月後尋回

這個站點使用的較為稀少,最初使用的時候沒有什麼問題,然而近期使用一次就讓人完全失去信任,在經過上面事件後還會使用的原因一樣是懶… 只能說自己還是沒學乖。

僅僅是因為運匠沒有美國站就再給他機會,疏不知這一次終於徹底把我打醒,印象中規定上就寫說要 2 天才會入庫,超過請聯絡,光是原本規定的就久到不可思議了,

我還是照規矩來,等到第 4 天還是不見蹤影才找客服,又逢假日,所以等周末過完才有消息,結果說只有收到一件,叫我再跟貨運確認,讓我賭爛到不行。

寫信給線上購物,說他們運出一概不負責,自己去跟 UPS 問,還提醒我他們規定不能送到轉運,整個很三小…

看 UPS 物流追蹤說是丟在碼頭的樣子,明明顯示已送達,查送達證明卻沒有照片,於是提起未送達申訴。

過了一個月 UPS 回說送到了,請再確認,還以為是想隨便把案子結掉,又氣了一回,再過五天 Shipgo 突然通知那包入庫了。

所以總的來說,應該是 UPS 和 Shipgo 都有問題,而且 UPS 或許責任更大一些,無法確定,可 Shipgo 相信是脫不了關係。

怎麼可能這麼大一個集貨服務,會跟這麼大的快遞沒有往來,東西就這樣丟下了也不找下的?我合理懷疑找別家就不會發生同樣問題。

之後打算依照這則[心得] 五家美國集運心得分享改試看看好運,日後有心得再來分享。

Raspotify / librespot 無法播放歌曲的暫時解法

· 閱讀時間約 2 分鐘

正文

平常有在 Raspberry Pi 上用 Spotify 播放音樂的習慣,用的是 Raspotify,就是把 librespot 包成 Debian 尤其是 Raspi 用的套件的專案,前幾天突然播不動,起先以為又是帳號被針對了…

後來弄巧成拙系統掛掉,也不確定是不是我親手搞爆的就是了,總之是乾脆重裝了,正好當作 clean install 升新版,之前一直懶得這麼做就卡在 Buster。

裝好後問題依舊,查到和我症狀一毛一樣的 issue,看起來是有災情,詳見 Getting status code 500s since Ads API sunset · Issue #1527 · librespot-org/librespot

起初找到的時候沒看到什麼簡便有效的方法,後來持續追蹤就看到有人說/etc/hosts 裡加上一筆 0.0.0.0 apresolve.spotify.com 的紀錄就行了,試了下還真的立竿見影,所以就是把那玩意擋掉的意思,蠻莫名其妙的…

我都已經是用付費帳號在播了還會撞到這種廣告關聯的問題…

不過開 issue 的人就有表示相信和 Spotify 的舊版廣告相關 API 下掉了有關…

暫且是這麼處置了,這件事也得記著,天知道會不會之後哪天變成反而因為這筆 DNS record 掛掉。

回顧

也不能說沒有收獲啦,因為一些很蠢的問題笨手笨腳的重裝很多次,時間花的遠沒有預期的久,主要好處是藉機升了新版。

再者是順便調整了音效介面相關的設定,音質似乎有顯著的變化,應該是好的方向啦… 我在這上面播也沒有追求音質就是了。

還有多學到了幾個音效相關的指令,像是 aplayspeaker-test,有點太晚就是,發現播不了的時候不確定到底是什麼部份出狀況, 因此重裝後也不曉得到底能不能播出聲音,但 raspotify 又處於播不了的狀態,等到找到有效解法才學會 speaker-test

後續更新

過沒太久 Raspotify 0.46.2 把 Librespot 升到最新版就把這問題給解決,不需要 workaround 了。

首次使用吸吸管(環保塑膠吸管)心得

· 閱讀時間約 3 分鐘

正題

過去就有使用過一些宣稱對環境友善的吸管,我對吸管的態度是需要他,可是搞到都禁用或用些廢物代替還是太白爛了,什麼插到烏龜你媽,那個問題是垃圾沒有被正確處置而不是那玩意材質是不是塑膠好嗎?每天看到吸管這樣用一次就丟用萬年不化,也是蠻不爽的,因此有點餘力還是會盡量選擇可能有改善的產品。

前陣子發現了吸吸管這個玩意,決定買來試試。

金屬吸管和矽膠吸管的麻煩點就是清洗很不方便,所以有好幾支金屬吸管但實在不愛用。

買來丟著一陣子剛剛才首次使用,會丟著的原因就是他有些事前作業要執行,看起來稍嫌複雜麻煩,實際操作了一遍也的確沒有到很直觀。

總之這部份就省略,直接說用起來感覺還不賴,雖然是用夾合的,實際吸起來不會不放心,清洗方面也便利許多。

之後就來看看到底是否耐用了。

這玩意要是真有那麼實用,那或許應該要成為新的日用品,至於那個使用門檻的問題,只要未來夠普及成為常識就不是什麼問題了,如同許多家電一樣。

以下順道分享下過往曾使用的其他聲稱環保的吸管產品。

玩艸植造 - 蒲草吸管

食力上申請試用的,用掛號寄給我也沒事前發寄送通知,害我拿到的時候距離提交心得只剩一天,來不及交出去,從此在試用平台黑掉沒機會試新的,有夠雞巴堵爛。

本身有個野草味,這可能有點看人,我還可以接受,放久了會脆化容易裂開的樣子,不算是個非常好用的產品,但絕對強過難用得要死的紙吸管數倍,有堪用以上程度。

也有想過要再購入,但是當時好像只有超大量的包裝,因而沒有再度使用。

蔗糖提煉環保吸管(Bio-PE)

之前逛百貨有那種舶來品展的時候順便買的,韓國東西,說是蔗糖提煉材質製造的,外觀和使用上完全就和一般吸管沒兩樣,也一樣有單獨的塑膠套包裝,不知道這個吸管套是否也是環保材質,所以當然好用,至於有沒有實質的環保功用,不得而知。

本來在找到吸吸管之前有想要再買,似乎沒有到很容易找,所以作罷。

圖片是從 momo 上的商店幹來的,想說不放個圖大概不知道在說哪個產品。

ECO STRAW

線上樂譜掃瞄轉檔服務實作了 ChatGPT 唬爛出來的功能

· 閱讀時間約 3 分鐘

Hacker News Daily 上讀到了這篇文章 - Adding a feature because ChatGPT incorrectly thinks it exists

我大致說下內容:

主角是一個叫作 Soundslice Sheet Music Scanner 的線上服務,提供上傳樂譜相片,將其轉檔為類似 GuitarPro 或 MuseScore 那種打譜軟體用的格式,方便閱讀、播放、編輯。

前陣子開始觀察到一些奇妙的錯誤,檢查了上傳的圖片,竟然是和 ChatGPT 的對話擷圖,上頭有 ASCII tab 譜,作者起先完全不明白這是怎麼回事,直到他親自試過才發現是 ChatGPT 豪洨說如果你想播放這個譜的內容的話可以用他們的服務。

然而該服務並沒有支援這種格式,完全是 ChatGPT 的幻覺。

這令他們受到了不切實際的期待,有損他們的商譽,考慮要直接在網站聲明沒有那種功能,最後決定乾脆把這個不存在的功能給做出來,反正本來就在他們排定會做的功能裡,只是順位在最底。

作者表示這大概是世界上第一次有人去做了 AI 妄想、唬洨存在的功能。


這一切是頗有共鳴的,問些相對冷門的領域的東西的問題 ChatGPT 就很會唬洨,我最近的例子是 CedarSpring Web Testing 相關的問題,都回答我一些不存在的功能或用法。

不過我更在意的是這年頭居然還有人在用那種 ASCII tab 譜,我以為是古早的時空背景下才流行,如今已經不太有人使用的東西才是…

我自己是沒有親自經歷過,畢竟是出社會後才真正開始學琴,但我想像中應該是早年網路頻寬比較有限,再加上打譜軟體也沒那麼普及等等因素才蔚為潮流的格式,在 Ultimate Guitar、911 Tabs 之類的網站上廣為使用。

在我還是學生的時候就已經都聽到是在用 gp 譜了啊,我過去還有找到可以讀取 gp 譜格式的開源軟體 powertabeditor,當時也早就有 Songsterr 這種線上網頁形式的,而且我看樂譜數量也是相當龐大了。

實在是有夠謎的…

WSL 2 因可用記憶不足而無法啟動的問題

· 閱讀時間約 2 分鐘
系統資源不足,無法完成要求的服務。
錯誤碼: Wsl/Service/CreateInstance/CreateVm/HCS/0x800705aa

[process exited with code 4294967295 (0xffffffff)]
You can now close this terminal with Ctrl+D, or press Enter to restart.

昨天正在打 Splitgate 2 突然想開一下 wsl 又遇到上面這個錯誤,前一次遇到的時候明明就沒有在打遊戲,所以困惑到不行。

這次才明暸原來是當下的系統記憶體不足,我桌機只有 32GB 的確是不多啦,可明明就還剩 8GB 以上,關了遊戲以後還真的就能開了…

於是查到 Advanced settings configuration in WSL # Main WSL settings 裡記憶體的預設值竟然是系統總記憶體的 50%。

沒事也切太多了吧,來改小一點看看還會不會撞到,日後電腦升級再順道加大,但絕對不能放預設抓一半就是了,有點瞎,一半的意思不就是要電腦夠閒或是主力都在 wsl2 上,超不合理啊。


後續更新:

看來問題根本不在記憶體… 後來又碰上了,當下關了一堆程式,閒置記憶體剩餘超過一半還是給我同樣的錯誤。

總之再度查找了起來沒什麼鳥結果,只發現這問題遠比想像中的普遍,大家都對於不講明什麼樣的資源不足感到莫名又束手無策。

Python 的 := 符號 (Assignment expressions)

· 閱讀時間約 2 分鐘

別名海象符號

What’s New In Python 3.8: Assignment expressions

PEP 572 – Assignment Expressions

3.8 加入的這個海象符號當年有注意到但沒看懂,也就被我淡忘掉了。

本來就很受不了多做一次不必要運算的行為,可是為了省那一次又多寫一個 assignment 也頗令人煩躁不舒爽,近期開始養成每天寫上一、兩題的習慣後特別有感。

讀到這則 Fastest Way to Read Excel in Python | Haki Benita 裡頭有用到才讓我回想起其存在並去找出究竟是什麼意思。

不算很常見,初見也不直覺,但用得上的時候真的能簡潔不少。

直接偷 release note 裡的例子來說明。

沒有 walrus operator 的情況下,一段程式懶惰的寫法如下:

if len(a) > 10:
print(f"List is too long ({len(a)} elements, expected <= 10)")

前述的減少不必要運算的不偷懶寫法則可能變成:

n = len(a)

if n > 10:

print(f"List is too long ({n} elements, expected <= 10)")

用上這個新符號的化就能夠簡化成:

if (n := len(a)) > 10:

print(f"List is too long ({n} elements, expected <= 10)")

拿這個例子來看就很容易理解,也就是顧名思義 assign 的同時亦是一個 expression,所以才能用在 if 的後頭。

另一個顯然很好用的情況就是在 while loop 裡:

# Loop over fixed length blocks

while (block := f.read(256)) != '':

process(block)

傳統的寫法多半會變成:

block = f.read(256)

while block != '':

process(block)

block = f.read(256)

Java Text Blocks (文字區塊)的運用要點

· 閱讀時間約 2 分鐘

最近開始拾起一些在 Java 裡屬相對較新的功能,例如本次想要稍微提下的 Text Blocks,這也是我個人期盼已久的功能。

自 Java 15 起 Text Blocks 脫離預覽成為標準功能,然而我的理解只停留在類似 Python 用 3 個引號括起來就可以寫下多行內容的程度。

至於縮排是怎麼認定的?尾巴的空白會保留還是被去掉?等問題由於過往的輕度使用大概都是在 SQL 語句上,便不是那麼在乎實際字串組成後的排版會長成什麼模樣,只要在原始碼裡面看起來順眼就行。

這回我下定決心要有足夠的理解便找到了這則官方教學 Programmer's Guide to Text Blocks,內容相當完善,相信已經涵蓋絕大部份使用上需注意的要點,亦有充足易懂的範例,強烈建議讀過原文,看似有相當長度實際上非常好理解且有不少示範,所以閱讀起來並不花費太多時間,以下取出一些摘要:

  • 基本語法
  • 解釋成品字串縮排空白計算的原則
  • 結尾的 3 個引號是否單獨成行會影響組成字串最後是否有個換行符號
  • 保留尾巴空白的技巧
  • 混用空白字元(空白跟 tab 等)縮排可能造成的問題
  • 如何使用跳脫連成同一行
  • 推薦/避免使用 Text Blocks 的時機
  • 應運而生的一些 instance method

以上要點大部份都是我原先沒想過要知道的事情,著是獲益匪淺,若干年前老覺得 Java 各種沒人性,近年許多實用功能補上來變成正式版,對於 Java 反而變得頗有好感了。

撿到一篇講古文:離線交易儲值卡的興衰史

· 閱讀時間約 1 分鐘

你所不知的塑膠貨幣歷史

2023-09-03 plastic money on Computers Are Bad

上面是一篇在 Hacker News Daily 看到專門講述 stored value cards,也就是一種餘額實際存在卡片內,離線進行交易的應用之興衰史。

裡頭從緣起、規範制定開發及相關技術、成功試驗案例乃至如今仍在營運中的大規模應用皆有涵蓋,相當詳盡。

令人感慨的是網路連線已經相當普及可靠,使得該技術在現代條件下沒有太多選用的理由,即便他有較線上交易簡便之處,當然也有其更複雜之處。

很喜歡這種講古的文章,這則又帶有一股哀傷的情緒…