[Grunt]EC2にsshログインしてコマンド実行とかSFTPを自動で実行する[AWS]

2013.05.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

sshログインやftpアップロードを自動でやりたい

EC2に対して何度もftpでアプリのアップロードやsshでログインして再起動とかやってると、非常に無駄を感じてしまいます。
そんな面倒な作業こそ、Gruntで解決しましょう。
今回はgrunt-sshモジュールを使って、EC2へsshログインとsftpでのファイルアップロードを試してみます。

環境構築方法

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.5
  • Node.js : v0.10.4
  • npm : 1.2.18

npmを使用して必要モジュールをインストールしましょう。
grunt-cliをグローバルインストール(まだインストールしていなければ)し、サンプル用ディレクトリを作成してpackage.jsonを作成した後、
gruntとgrunt-sshをインストールします。

% npm install -g grunt-cli 
% mkdir ssh-sample
% cd ssh-sample
% npm init //package.json作成
% npm install grunt grunt-ssh --save-dev

また、今回はsshやsftpでアクセスする対象のリモートサーバをEC2で用意しました。(Amazon Linuxで22番ポート開放)
pemファイルを取得し、sshでEC2にログインできる状態にしておいてください。

sshログインして任意のコマンドを実行

では、gruntタスクを実行してEC2へログインし、適当なコマンドを実行させてみましょう。
ssh-sample直下に、次のようなGruntfile.coffeeを作成します。

module.exports = (grunt) ->
  pkg = grunt.file.readJSON 'package.json'
  grunt.initConfig
    sshexec:
      test:
        command: 'date > ./date.txt',
        options:
          host: '<EC2のアドレス>',
          username: 'ec2-user',
          password: '',
          privateKey: grunt.file.read("<pemファイルのパス>")

  grunt.loadNpmTasks 'grunt-ssh'

loadNpmTasksでgrunt-sshモジュールをロードし、実行するコマンドはcommandプロパティで設定します。
とりあえず、date結果をファイルに出力するだけです。ホスト名やユーザー名はoptionsで各設定を行います。
キーファイルの指定は、privateKeyプロパティでpemファイルのパスを指定すればOKです。

では、タスクを実行してみましょう。
タスクを実行後にEC2を確認してみると、date.txtが出力されています。

% grunt sshexec
Running "sshexec:test" (sshexec) task

Done, without errors.

sftpでファイルアップロード

sftpを使って、指定したファイルをアップロードすることもできます。
ローカルでテストアップロード用に、upfilesディレクトリを作成し、その中に適当なファイルを作成しましょう。
EC2ではホームディレクトリ下に、アップロードしたファイルを置くためのdistディレクトリを作成しておきます。

module.exports = (grunt) ->
  pkg = grunt.file.readJSON 'package.json'
  grunt.initConfig
    sftp:
      test:
        files:
          "upfiles/": "upfiles/*",
        options:
          path: '/home/ec2-user/dist/',
          host: '<EC2のアドレス>',
          username: 'ec2-user',
          password: '',
          privateKey: grunt.file.read("<pemファイルのパス>"),
          srcBasePath: 'upfiles/'

  grunt.loadNpmTasks 'grunt-ssh'

sftpではfilesプロパティでアップロードするファイルの指定、pathプロパティでアップロード先ディレクトリの指定をします。
また、srcBasePathを指定することで、アップロードファイルを指定したファイルのパスからsrcBasePathで指定したパスを削除し、
残ったパスをアップロード後のファイルパスとして使用します。

ではsftpを実行してみましょう。問題なくアップロードできることがわかります。

% grunt sftp
Running "sftp:test" (sftp) task

Done, without errors.

まとめ

今回はgrunt-sshモジュールを使用して、sshログインとsftpを試してみました。
繰り返し行う面倒な作業はとことん自動化して楽をしましょう。

参考サイトなど