Java開発者のためのcloud-foundry講座【Part 4 SPRING PROFILES編】

USING CLOUD FOUNDRY SERVICES WITH SPRING: PART 4 – SPRING PROFILES(意訳)

(Posted on November 10th, 2011 by Scott Andrews in 3.1Cloud ComputingCloud Foundry.)

Spring 3.1に重要な新機能が追加されました。新しい環境用APIでアプリケーションへのプロパティ設定を容易にしたり、条件に応じてフラグが付いている設定を有効にします。 このシリーズの一番最初のブログにCloud Foundryはデータベース接続に関する設定を手動ではなく、自動で設定し接続できることが書かれていましたが、このプロセスをもう少しハンドリングしなければならない状況、例えば、アプリケションが複数のデータベースサービスを利用しなければならない場合などは<cloud>ネームスペースの方法を使います。この方法はDataSourceの定義をXMLに一行追加するだけで利用できます 。<cloud>ネームスペースは非常にパワフルな方法ですが、アプリケーションがCloud Foundry上で動かすときしか利用できません。ある意味、この 方法はコンフィグレーションがCloud Foundryに依存したものになってしまいます。 Cloud Foundry以外で展開するときは、このコンフィグレーションは無効とすべきです。 このため、Cloud Foundryへのアプリケーションの展開を考えると<cloud>ネームスペースの場合、ローカル環境での単体テストを行うことはできません。単体テストなしに、いきなり統合テストのためアプリケーションをCloud Foundry上に展開することは受け入れ難いことです。この問題をSpring Profileは解決することができます。

Spring Profileとは、コンフィグレーションにフラグを付け、ある条件に合致したときのみこのフラブ部分に記述されたコンフィグレーションが有効になります。 ほとんどのアプリケーションプラットフォームでは、開発、テスト及び本番用のコンフィグレーションがそれぞれ存在し、環境に応じて使い分けされますが、このプロファイル(Spring Profile)を使うことによりコンフィグレーションに柔軟性を持たせることができます 。設定されたプロファイルのすべての条件に合致しなかった場合、”default”のプロファイルとなり、そこに記述されたコンフィグレーションが有効になります。このプロファイルは環境の違いによってコンフィグレーションをスワップし、または、アプリケーションのオプション機能の設定を行うことができます。使い方は開発者の思いのままに利用することができます。

ISOLATING CLOUD FOUNDRY SPECIFIC CONFIGURATION

SpringアプリケーションがCloud Foundry上に展開するときは自動的に”cloud”のプロファイルが有効になります。展開する場所に依存せずにCloud Foundryに固有なコンフィグレーションを予め定義することができるので便利です。<cloud>ネームスペース固有のコンフィグレーションは”cloud”のプロファイルのブロック以内に定義することでCloud Foundryでなくてもアプリケーションを動作させることができます。

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg ref="mongoDbFactory" />
</bean>
<beans profile="default">
    <mongo:db-factory id="mongoDbFactory" dbname="pwdtest" host="127.0.0.1" port="27017" username="test_user" password="efgh" />
</beans>
<beans profile="cloud">
    <cloud:mongo-db-factory id="mongoDbFactory" />
</beans>

上記のサンプルコンフィグレーションは、Spring MongoTemplateのコンフィグレーションをConnection Factoryとして二者択一の環境で使えるように設定したものです。cloud foundry上で動作するときはConnection Factoryは自動的に設定され、cloud foundry上でない場合はローカル上にMongoDBインスタンスが存在し、接続のためのコンフィグレーションは手動で設定します。

ENABLING AN APPLICATION FEATURE ON CLOUD FOUNDRY

ここで共通した一つの課題、「cloud foundry上のアプリケーションからのメール送信」について考えてみましょう。残念ながら、SPAMメールの防止、その他の悪用を防ぐ理由のためCloud Foundry上のアプリケーションからのSMTPはブロックされます。しかしながら、HTTP Webサービス経由でSendGridのようなサービスプロバイダーを利用することでCloud Foundry上のアプリケーションからメールを送信ことはできます。通常、使っているデータセンター上ではSMTP Serverを使い、Cloud Foundry上ではHTTP Webサービス経由でSendGridサービスを利用することを考えると、以下のようなにプロファイルでSendGridサービスと接続するためのBeanを定義できます。

<beans profile="cloud">
 <bean name="mailSender" class="example.SendGridMailSender">
 <property name="apiUser" value="youremail@domain.com" />
 <property name="apiKey" value="secureSecret" />
 </bean>
</beans>

CLOUD PROPERTIES

Cloud Propertiesはアプリケーションに直接関係を持つプロパティで、Spring プロパティ・プレイスホルダーに対応することで利用することができます。これらのプロパティはアプリケーションの基本的な情報に関するもので、プロパティ名、クラウドプロバイダ名、アプリケーションにすべてのサービスをバイディングするためのコネクション情報などがあります。

<beans profile="cloud">
    <bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql://${cloud.services.mysql.connection.host}:${cloud.services.mysql.connection.port}/${cloud.services.mysql.connection.name}" />
        <property name="user" value="${cloud.services.mysql.connection.username}" />
        <property name="password" value="${cloud.services.mysql.connection.password}" />
    </bean>
</beans>

上記の例は、一般的なサービスプロパティで”cloud.services.{service-name}.connection.{property}”のフォームで利用します。このコネクション・プロパティの仕様はサービスタイプによって異なります。利便性のため、アプリケーションにバイディングする一つのサービスタイプの場合、エイリアスはサービス名の代わりにサービスタイプ名をベースとして作成されます。MySQLサービスの場合、”cloud.services.mysql.connection.{property}”のフォームを使います。

AVAILABLE  TODAY,AUTOMAGICALLY

Cloud Profile及びPropertiesと共に、SpringアプリケーションとしてCloud Foundry上で動作するときに有効になります。この場合、Spring 3.1以降が必須となります。我々のゴールは、必要最小限の作業でCloud Foundry上にアプリケーションが動作するための無理ないパスを作ることです。最も重要なことは、開発環境ごとに手動で設定することなく、Springアプリケーションとして最大限のポータビリティ性を確保することです。


本ブログの記事は、Using Cloud Foundry Services with Spring: Part 4 – Spring Profilesの意訳であり、完全な翻訳ではございません。所々、翻訳を省略しているところや、原本にはない文を追加しているところもございます。また、翻訳の正確性が欠ける可能性もございますので、原文にも目を通すことを推奨いたします。ご了承ください。