CodePipeline実行時にconfig.propertiesを使って環境ごとの値を切り替える方法【application.ymlの環境変数のように設定】
Code Pipeline内のCode Build実行時にconfig.propertiesに環境変数から値を取得しようと思ったときに躓いた話です。
環境変数から値を取得することはできず、config.propertiesにプレースホルダーを使いbuildspec.yml内で「sed」にて置換することで対応しました。
今まで携わったJava開発のプロジェクトはSpring Bootでapplication.ymlを使用していたため、以下のように設定すれば自動(プログラム対応無し)で環境変数から値を取得することができました。
application.yml
datasource: username: ${DB_USERNAME} password: ${DB_PASSWORD}
結論
Spring Bootを利用していないJavaプロジェクトでは自動でconfig.propertiesに環境変数から値は取得できない。
「Javaコードで環境変数を読み込む」や「config.propertiesにプレースホルダーを使いJavaで置換する」などでプログラム対応すれば可能
プログラム修正はせずに対応する方法
目的がconfig.propertiesを各AWS環境で共通化することであれば、config.propertiesに環境変数から値を取得したかのようにはできます。
config.propertiesにプレースホルダーを使い、buildspec.yml内で「sed」にて置換する方法になります
前提:Secrets Managerに値は設定(Parameter StoreでもOK)
config.properties
test.db.username={DB_USERNAME} test.db.password={DB_PASSWORD}
buildspec.yml(必要な箇所のみ抜粋)
env: secrets-manager: dbusername: /cmn/db:username # 右辺はSecrets Managerキー dbpassword: /cmn/db:password # 右辺はSecrets Managerキー ・ ・ ・ build: commands: - sed -i "s/{DB_USERNAME}/${dbusername}/g" config.properties - sed -i "s/{DB_PASSWORD}/${dbpassword}/g" config.properties
以上になります。
もっとシンプルな方法で対応できそうな気もしますが、思いつきませんでした。