CFアプリ開発と管理#19 サービスへのSSHアクセス

このトピックでは、デプロイされたサービス・インスタンスに直接コマンドラインでアクセスする方法について説明します。 たとえば、直接のSQLコマンドを実行してスキーマを編集したり、データをインポートおよびエクスポートしたり、アプリケーションデータの問題をデバッグしたりするには、データベースにアクセスする必要があります。

このページでは、cf CLI v6.15.0以降を使用していることを前提としています。

サービスへの直接コマンドライン・アクセスを確立するには、ホスト・アプリケーションをデプロイし、そのSSHおよびポート転送機能を使用して、アプリケーション・コンテナを介してサービス・インスタンスと通信します。 以下に概要を説明するテクニックは、MySQLやRedisなどのTCPサービスで動作します。

注：このトピックの手順では、サービスキーの使用が必要であり、すべてのサービスがサービスキーをサポートしているわけではありません。 一部のサービスでは、アプリケーションの[バインド](https://docs.cloudfoundry.org/devguide/services/application-binding.html)だけで資格情報をサポートします。

*注意事項: この記事は、Cloud Foundry Documentaion [Accessing Services with SSH](https://docs.cloudfoundry.org/devguide/deploy-apps/ssh-services.html) (last updated: May 4, 2017) からの独自の翻訳とコメントです。内容を保証するものではありません。*



## サービス・インスタンスの作成

1. ターミナル・ウィンドウで、`cf login`を使用してデプロイメントにログインします。

2. [cf marketplace](http://cli.cloudfoundry.org/ja-JP/cf/marketplace.html)コマンドを使用して利用可能なマーケットプレイスサービスを一覧表示します。

~~~
$ cf marketplace
mysql  100mb MySQL databases on demand
~~~

3. サービスインスタンスを作成します。 [create-service](http://cli.cloudfoundry.org/ja-JP/cf/create-service.html)コマンドの一部として、サービス名、サービスプラン、およびサービスインスタンス用に選択した名前を指定します。

~~~
$ cf create-service MySQL 100mb MY-DB  
~~~



## ホストアプリをPUSH

SSHトンネルのホストとして機能するアプリケーションをプッシュするには、Cloud Foundryに正常にデプロイするアプリをプッシュします。

注：アプリをプッシュする前に準備しておく必要があります。 デプロイするアプリケーションの準備の詳細については、「[アプリケーションのデプロイ](https://docs.cloudfoundry.org/devguide/deploy-apps/deploy-app.html)」トピックを参照してください。


1. あなたのアプリをプッシュします。

~~~
$ cf push YOUR-HOST-APP
~~~

2. あなたのアプリにSSHを有効にしてください。

~~~
$ cf enable-ssh YOUR-HOST-APP
~~~


注：アプリへのSSHアクセスを有効にするには、アプリを含むスペースとCloud Foundryの両方でSSHアクセスを有効にする必要があります。 詳細については、[アプリケーションSSHの概要](https://docs.cloudfoundry.org/devguide/deploy-apps/app-ssh-overview.html)のトピックを参照してください。


## サービスキーを作成する

サービス・インスタンスへのSSHアクセスを確立するには、SSHトンネルを構成するための重要な情報を含むサービスキーを作成する必要があります。

1. `cf create-service-key`コマンドを使用して、サービスインスタンスのサービスキーを作成します。

~~~
$ cf create-service-key MY-DB EXTERNAL-ACCESS-KEY
~~~


2. `cf service-key`コマンドを使用して新しいサービスキーを取得します。
 
~~~
$ cf service-key MY-DB EXTERNAL-ACCESS-KEY
Getting key EXTERNAL-ACCESS-KEY for service instance MY-DB as user@example.com

{
"hostname": "us-cdbr-iron-east-01.mysql.net",
"jdbcUrl": "jdbc:mysql://us-cdbr-iron-east-03.mysql.net/ad_b2fca6t49704585d?user=b5136e448be920\u0026password=231f435o05",
"name": "ad_b2fca6t49704585d",
"password": "231f435o05",
"port": "3306",
"uri": "mysql://b5136e448be920:231f435o05@us-cdbr-iron-east-03.mysql.net:3306/ad_b2fca6t49704585d?reconnect=true",
"username": "b5136e448be920"
}
~~~


## SSHトンネルの設定

`cf ssh`を使用してサービスインスタンスへのSSHトンネルを設定します。 以下の例のコマンドをサービスキーの情報で調整します。

~~~
$ cf ssh -L 63306:us-cdbr-iron-east-01.mysql.net:3306 YOUR-HOST-APP
~~~

* ポート転送には、使用可能なローカルポートを使用してください。 たとえば、63306となります。
* 上記で検索したサービスキーのhostnameに指定されたアドレスに`us-cdbr-iron-east-01.mysql.net`を置き換えます。
* `3306`を上記のポートの下にあるポートに交換します。
* `YOUR-HOST-APP`をホストアプリケーションの名前に置き換えてください。

コマンドを入力した後、別のターミナルウィンドウを開き、「[サービスインスタンスへのアクセス]()」の手順を実行します。


## あなたのサービスインスタンスにアクセスする

サービス・インスタンスへの直接のコマンドライン・アクセスを確立するには、そのサービスに関連するコマンドライン・ツールを使用します。 この例では、MySQLコマンドライン・クライアントを使用してMySQLサービス・インスタンスにアクセスします。

~~~
$ mysql -u b5136e448be920 -h 0 -p -D ad_b2fca6t49704585d -P 63306
~~~

* b5136e448be920を、サービスキーのusernameの下に指定されたユーザ名に置き換えます。
* -h 0はmysqlにローカルマシンへの接続を指示します。
* -pは、mysqlにパスワードを要求するように指示します。 プロンプトが表示されたら、サービスキーにあるパスワードの下にあるパスワードを使用します。
* ad_b2fca6t49704585dをサービスキーのnameに指定されたデータベース名に置き換えます。
* -P 63306は、ポート63306に接続するようにmysqlに指示します。