AEM Developerの皆様、こんにちは。大和株式会社の熊井です。
AEM as a Cloud Service(以下AACS)をご利用の皆さま、環境変数使ってますか?
Cloud Managerで環境変数使えるの!?という方はまずは以下をご参照ください。
https://experienceleague.adobe.com/docs/experience-manager-cloud-service/content/implementing/using-cloud-manager/environment-variables.html?lang=ja
この記事では環境変数を使うとこんなことが出来て便利!という視点で話を進めています。
どこで使うのか
Cloud Managerの環境変数は以下の場所で使用できます。
・AEM(author, publish, preview, dispatcher)
・OSGi設定ファイル
・Cloud Manager Pipeline
何が出来るのか
1つの環境に対して2つの軸で変数をセット出来ます。
軸の1つめはどのサービス(Tier)に対して設定をするか、2つめはタイプです。
サービス(Tier)については「All, Author, Publish, Preview」の4つから選択、タイプは「Variable, Secret」の2つから選択することが出来ます。
これらを適切に組み合わせることによって、適切な環境に適切な変数を適用させることが可能となります。
何が嬉しいのか
各種パスワードをべた書きせずに済む
AACS以外のAEM(AEM6.5など)であれば、メールサーバーのパスワードなどをOSGi設定で管理するような場合、cryptoという機能を使用して暗号化することが出来ました。 (http://localhost:4502/system/console/crypto)
しかしながら、AACSにおいてはWeb console(/system/console)に接続することが出来ない為、crypto supportの機能を使用することが出来ません。
とはいえ、OSGi設定ファイルにパスワードをべた書きするというのはセキュリティ面から見て禁忌であるため、対応が必要です。
その際、Cloud Managerの環境変数で「Secret」タイプを使用することによって、安全にパスワード管理を行うことが出来ます。preview環境特有の設定値を持つことが出来る
AEMで環境別の設定を持つ際のお作法として最もよく使うのは、実行モードを使用して設定を呼び分けるやり方です。
AACSでもこの機能は継続して使用できますが、記事作成日現在、使用可能な実行モードはauthor, publish, dev, stage, prodの5種類です。
つまり、preview用の実行モードは用意をされていないことになります。
preview環境を単純なIP制限だけを施した上でpublishと同機能のものとして運用する際は特に考える必要はありませんが、 例えばpreviewだけはログイン機能を使いたい、外部連携の接続先を変えたい(無効にしたい)といったようなケースにおいてはpublish用の設定とpreview用の設定を分ける必要があります。
前述しましたが、Cloud Managerの環境変数には適用先の環境として「preview」が用意されていますので、これを使うことで要件を満たすことが出来ます。デプロイを挟まずに設定を変えることが出来る
通常の設定変更プロセスに則りパイプラインをまわしたデプロイを行った場合、早くて1時間、長ければ2時間程かかります。
おおよその場合はこれで問題無いと思いますが、もっとリアルタイムに設定変更を行いたいケースが出てくることがあります。
例えばログの出力レベルの変更。予めOSGi設定ファイルを作成しCloud Managerの環境変数を読み込むように設定しておく必要はありますが、 これを行っておけば「アプリをデプロイしたらなんか動きがおかしい!どこがおかしいかデバッグをしなくてはならない!」といった場合に Cloud Managerの環境変数でログレベルを決めている変数を変更することでリードタイム短く設定変更が可能です。 いつも使う機能ではないですが、仕込んでおけば何かあったときに解決までの時間を早くすることができます。
実際にやってみた
一例としてCloud Managerの環境変数を定義し、OSGi設定ファイルで読み込むということをやってみます。
今回はドメインルートへのアクセス時にリダイレクト先を制御する役目である「com.day.cq.commons.servlets.RootMappingServlet」を題材にしてやっていきます。
まずは設定を行う前、com.day.cq.commons.servlets.RootMappingServletの初期値はこのようになっています。
それでは設定していきましょう。
Step1 :MavenプロジェクトフォルダにOSGi設定ファイルを作成する。
やり方は通常のOSGi設定ファイル作成方法と同じです。AACSのお作法に則って拡張子.cfg.jsonファイルを作成します。
設定値はこちら
※通常、「com.day.cq.commons.servlets.RootMappingServlet」が持つプロパティは「rootmapping.target」のみですが、今回はSecretの記載方法のサンプルとして「sample.secret」を追加しています。
{ "rootmapping.target": "$[env:ROOT_PATH;default=/aem/start.html]", "sample.secret": "$[secret:SAMPLE_SECRET]" }
設定値の構成は以下の通りです。
env:ROOT_PATH;default=/aem/start.html
項目 | 説明 | 必須 |
---|---|---|
env | 環境変数のTypeに該当。envかsecretが入る | ○ |
ROOT_PATH | 環境変数のNameに該当 | ○ |
default=~ | 環境変数の設定がない場合のdefault値 | - |
Step2 :変更したソースをデプロイ
通常通りCloud Managerパイプラインによってデプロイを行います。
Step3 :環境変数の作成
Cloud Managerから環境変数を作成していきます。
まずはEnvironmentsタブへ移動し、さらにConfigurationタブへ移動し、Add/Updateをクリックします。
今回作成した設定はこちら
追加後、saveを押せば作成が完了します
Step4 :少し待つ
saveを押すと環境への適用がはじまります。
所要時間は多少ブレがありますが、今回は5分ほどで完了しました。
適用中はこのようになっています。
適用が完了するとこうなります。
以上。簡単ですね。
なお、secretで作成をした環境変数は一度saveをした後は編集、削除のみ可となり閲覧することは出来ません。
ちなみに、developer consoleからconfigurationの状態を見ることが出来ますが、このようになります。
変数が適用出来ているか、は実際の動きをみてご確認ください。
おわりに
環境変数は意識せずともプロジェクトを構築することはおおよそ可能ですが、うまく使えれば大きく運用効率を高めてくれるものとなります。
Cloud Managerへの権限設計と共にぜひご検討ください!