Help us understand the problem. What is going on with this article?

Lambdaでコマンドやシェルスクリプトを実行してみる(Node.js)

More than 3 years have passed since last update.

Lambdaでコマンドやシェルスクリプトを実行してみる(Node.js)

小ネタです。

コマンドの実行をとりあえずやってみる

Lambdaを選択後のBlueprintを選ぶ画面で node-exec というのがあるのでそれを選べば実行できます。

コードは以下のようになっていました。

index.js
var exec = require('child_process').exec;

exports.handler = function(event, context) {
    if (!event.cmd) {
        context.fail('Please specify a command to run as event.cmd');
        return;
    }
    child = exec(event.cmd, function(error) {
        // Resolve with result of process
        context.done(error, 'Process complete!');
    });

    // Log process stdout and stderr
    child.stdout.on('data', console.log);
    child.stderr.on('data', console.error);
};

child_process.execメソッドでは第一引数に実行するコマンドを指定し、第2引数でコマンドが終了した時に結果をコールバックで受け取とっています。上記例だとevent.cmdとして実行するコマンドを指定しています。
また、コマンド実行時の標準出力、標準エラー出力はdataイベントが発生したタイミングで随時console.logとして出力されるようになっています。

Node.jsのv0.11以降であればexecSyncというメソッドが追加されており、同期的にコマンド実行ができますが、2015/12/26現在のLambdaで実行可能なNode.jsはv0.10.36となっていたのでこれは使えないですね。。。。

話が少しそれてしまいました。
試しにマネージメントコンソールのLambdaのページからコマンドを実行してみます。

画面上で作成したfunctionを指定し、

Action->Configure test event

と選択し

{
  "cmd": "cat /etc/system-release"
}

という形で記述する事でコマンドを実行する事ができます。
ちなみに実行すると以下の結果でした。

2015-12-26T06:48:42.028Z    b37dec85-ab9c-11e5-a810-83acc71c00c9    Amazon Linux AMI release 2015.09

シェルスクリプトを実行してみる

では次にシェルスクリプトを実行してみます。Nodeのコードを./exec.shを実行するように変更し、併せて実行するシェルスクリプトのファイルをアップロードする事で実行するようにしています。

ディレクト、ファイルを作成します。

$mkdir node-exec
$cd node-exec
$vi index.js
$vi exec.sh
index.js
var exec = require('child_process').exec;

exports.handler = function(event, context) {
  child = exec('/bin/bash ./exec.sh', function(error) {
      // Resolve with result of process
      context.done(error, 'Process complete!');
  });

  // Log process stdout and stderr
  child.stdout.on('data', console.log);
  child.stderr.on('data', console.error);
};
exec.sh
#!/bin/bash


# 以下にシェルスクリプトを書く
ls /usr/bin
ls /bin

ファイル作成後、zip圧縮し、lambdaへアップロードします。

# zipにまとめる
$zip -r node-exec.zip index.js exec.sh

# コードのアップロード.function-nameが違う場合には適宜変更
$aws lambda update-function-code --function-name node-exec --zip-file fileb://./node-exec.zip

上記を実行する事でコマンドが実行できます。

[おまけ]lambdaで色々やってみた

以下、おまけです。

  • awsコマンドはインストールされているか->されていません
  • curlによるメタデータの取得->できませんでした
  • curlによるgoogleへの接続->できました
  • echo $PATH->/usr/local/bin:/usr/bin:/bin。コマンドをざっと見る限り、Linuxコマンドはあまり制限されていないようでした
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした