Eclipseでらくらくファイルアップロード

2013.04.01

こんにちは。
eclipseからsshを使ってファイルをアップロードして、さらにコマンドを実行するなんてことをやってみたいと思います。今回はAWSのEC2を使ってやってみました。

実行環境

今回使用する環境は以下になります。
Amazon Linux
JAVA7
Pleiades All in One 3.7.2
PuTTYgen

JARの設定

今回、実行するファイルのアップロードなどはAntを使って実行します。Antって色々なことができますね。
デフォルトの状態ではsshを使えないので必要なjarファイルを設定します。
メニューからWindwo>設定>Antを選択します。
次にAntメニューを開き、ランタイムを選択します。「クラスパス」タブが開かれていますので、「Antホーム項目を」選択し「外部JARの追加」をクリックします。
使用しているpleiades配下のeclipse/pluginsフォルダにある「com.jcraft.jsch_0.1.44.v201101211721.jar」ファイルを選択します。
これで、Antからsshが使えるようになります。

鍵をつくりましょう

Amazon Linuxに接続するので、sshに必要な鍵を作ります。鍵は作らないでユーザID、パスワードだけで接続する環境の場合は読み飛ばしてください。
今回、鍵を生成するのに使用したのはPuTTYgenです。また、鍵を使用するのに必要なEC2の秘密鍵はダウンロード済みとします。
PuTTYgenを起動させ、Loadボタンをクリックし、ダウンロードした秘密鍵を読み込みます。Key passphaseとConfirm passphaseを入力し、Save Private keyで鍵を生成します。WinSCPなどでAmazon Linuxに接続するはこれで鍵の生成は終了ですが、Antでの接続はOpenSSHでないと出来ません。ここ結構ハマりポイントです。
PuTTYgenのメニューからConversions>Export OpenSSH keyを選択し、保存します。これでOpenSSHの鍵が作成できました。

PuTTYgen2

プロジェクトの構成

プロジェクト構成は以下になります。今回は静的ファイルが格納されている「webapp」配下の「css」「images」「html」フォルダを対象にファイルアップロードしたいと思います。

 プロジェクト

Antの実行の流れ

Antからの実行の流れとしては

  1. アップロードするファイルを圧縮して1つのファイルにする
  2. sshでサーバに接続してファイルアップロードする
  3. アップロードしたファイルを解凍する

になります。
それではAntの実行ファイルを作成していきたい思います。今回はプロジェクト直下にbuild.xmlというファイルで作成します。

1.ファイルを圧縮して1つのファイルにする

フォルダをアップロードする前に対象フォルダを1つにまとめます。
Antではtarタスクを使用することでtarファイルの作成が可能です。これをつかって3つのフォルダを1つにまとめます。

<target name="tar.gz">
  <tar destfile="/src/main/webapp/sample-files.tar.gz" compression="gzip">
    <tarfileset
      dir="/src/main/webapp"
      prefix="sample-files"
      excludes="WEB-INF/**"
       />
  </tar>
</target>

compression属性を指定することでgzip形式に圧縮しています。その他にbzip2の圧縮が可能です。compression属性を記述しなければ圧縮はされません。圧縮の対象はwebappフォルダ以下を指定していますので、圧縮対象に含めたくない「WEB-INF」はexcludes属性を指定しています。

2.sshでサーバに接続してファイルアップロードする

ファイルのアップロードにはscpタスクを使用します。

<target name="upload">
  <scp remoteTodir="root@xxx.xxx.xxx.xxx:/tmp"
     keyfile="c:/sample.ppk"
     trust="true"
     verbose="true"
     passphrase="xxxxx">
    <fileset dir="dist">
      <include name="*.*" />
    </fileset>
  </scp>
</target>

 remoteTodir属性は接続情報を指定します。「ユーザ名@接続先:アップロードするディレクトリ」
keyfile属性に先ほど生成した鍵を指定します。
filesetではアップロードの対象をフォルダ以下全てとしているので複数ファイルがある場合もアップロード対象としています。
今回、使用した環境では「key」と「passphrase」だけが必要でしたが、パスワードも必要な場合は「password」属性も設定可能なので環境に合わせて適宜設定して下さい。

3.アップロードしたファイルを解凍する

ファイルがサーバの/tmpにアップロードした後にそのファイルを解凍したいと思います。
コマンドの実行はsshexecタスクを使用します。

<target name="sshexec">
  <sshexec
    host="xxx.xxx.xxx.xxx"
    username="root"
    keyfile="c:/sample.ppk"
    passphrase="xxxxx"
    command="cd /tmp;tar xzvf ${static-files.name}.tar.gz"
    trust="true"/>
</target>

ファイルアップロードと同様に「key」と「passphrase」を指定していますが、ここでも「password」属性も設定可能です。
サーバに対するコマンドの実行は「command」属性で指定します。ここではcdコマンドとtarコマンドを使用しています。コマンドはセミコロンで区切ることで複数指定が可能です。
ただし、呼び出すコマンドが多くなると可読性が悪くなるので、その場合はサーバにシェルを用意してきそのシェルを呼び出すのがいいかと思います。

実行しましょう

上記の3つのタスクを呼び出す起動用のtargetを用意します。最終的には以下のようなbuild.xmlを作成しました。

<?xml version="1.0" encoding="UTF-8"?>
<project name="sample" default="execute" basedir=".">
  <property name="webapp" value="${basedir}/src/main/webapp"/>
  <property name="static-files.name" value="sample-files" />
  <property name="file.dist"  location="dist"/>

  <!-- =================================
      target: tar.gz
    ================================= -->
  <target name="tar.gz">
    <tar destfile="${file.dist}/${static-files.name}.tar.gz" compression="gzip">
      <tarfileset
        dir="${webapp}"
        prefix="${static-files.name}"
        excludes="WEB-INF/**"
         />
    </tar>
  </target>
  <!-- =================================
      target: upload
    ================================= -->
  <target name="upload">
    <scp remoteTodir="root@xxx.xxx.xxx.xxx:/tmp"
       keyfile="c:/sample.ppk"
       trust="true"
       verbose="true"
       passphrase="xxxxx">
      <fileset dir="${file.dist}">
        <include name="*.*" />
      </fileset>
    </scp>
  </target>
  <!-- =================================
      target: sshexec
    ================================= -->
  <target name="sshexec">
    <sshexec
      host="xxx.xxx.xxx.xxx"
      username="root"
      keyfile="c:/sample.ppk"
      passphrase="xxxxx"
      command="cd /tmp;tar xzvf ${static-files.name}.tar.gz"
      trust="true"/>
  </target>
  <!-- =================================
      target: execute
    ================================= -->
  <target name="execute">
    <antcall target="tar.gz" />
    <antcall target="upload" />
    <antcall target="sshexec" />
  </target>
</project>

これでeclipse上からbuild.xmlを実行してあげれば簡単にファイルのアップロード及びファイルの解凍が出来るようになりました。

まとめ

いかがでしたでしょうか。Antを使うとことで自分のローカル環境からAWSなどのサーバに対して簡単にアップロードし、サーバのコマンドも実行できるようになりました。これをさらに拡張すればサーバ上で起動しているアプリケーションへの反映などが簡単にできるよになるかと思います。