目次

目次

JavaScript SDKでLambdaのソースコードを確認する

松木佑徒
松木佑徒
最終更新日2017/08/01 投稿日2017/08/01

必要なライブラリを読み込む

LambdaのソースコードはS3上にzip形式で配置されているため、 AWS JavaScript SDKに加えてjszipというzipファイルを扱うライブラリを使用します。

<script src="//sdk.amazonaws.com/js/aws-sdk-2.72.0.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jszip-utils/0.0.2/jszip-utils.min.js"></script>

AWS JavaScript SDKの初期化を行う

まずSDKを初期化します。 Credentialsの生成方法はいくつかありますが簡単なAccessKey/SecretKeyの方式で試します。

AWS.config.region = 'ap-northeast-1';
AWS.config.credentials = new AWS.Credentials({
  accessKeyId: config.access_key,
  secretAccessKey: config.secret_key
});

Lambdaのソースコードを取得する

次にLambdaのソースコードを取得します。 正確にはソースコードが配備されているS3への認証付きURLを取得します。

function get_source_url(function_name) {
  new AWS.Lambda().getFunction({FunctionName: function_name}, function (err, resp) {
    if (err) throw err;
    console.log(resp.Code.Location);
  });
}

Zipを展開してコンソールに出力する

S3に配置されているURLでソースコードのダウンロードは可能ですがzip圧縮されています。 圧縮してあるファイルをそのまま表示はできませんのでダウンロードして展開する必要があります。 ソースコードは以下です。

function show_code(source_url) {
  JSZipUtils.getBinaryContent('https://crossorigin.me/' + source_url, function (err, data) {
    if (err) throw err;
    JSZip.loadAsync(data).then(function (zip) {
      Object.keys(zip.files).forEach(function (key) {
        zip.file(key).async("string").then(function (content) {
          console.log(content);
        });
      });
    });
  });
}

簡単に解説します。

crossorigin.me を使用しているのは JSZipUtils.getBinaryContent がCORSに対応していないため、 プロキシ的に間に挟んでS3に要求を出しています。 返却されたzipのソースを JSZip.loadAsync で展開します。Promiseなので .then で結果を受け取ります。 zip直下のファイルをループします。 key はファイル名で zip.file(key) でzipファイル内のファイルが取れます。 ファイルはエンコードされているためデコードした文字列を取得するには .file(key).async("string") とします。

以上です。 最後に全部を簡単に試せるソース全体を貼っておきますのでよかったら試してみてください。

<script src="//sdk.amazonaws.com/js/aws-sdk-2.72.0.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jszip-utils/0.0.2/jszip-utils.min.js"></script>
<script>
  AWS.config.region = 'ap-northeast-1';
  AWS.config.credentials = new AWS.Credentials({
    accessKeyId: '<AWS Access Key>',
    secretAccessKey: '<AWS Secret Key>'
  });
  function get_source_url(function_name, callback) {
    new AWS.Lambda().getFunction({FunctionName: function_name}, function (err, resp) {
      if (err) throw err;
      callback(resp.Code.Location);
    });
  }
  function show_code(source_url, callback) {
    JSZipUtils.getBinaryContent('https://crossorigin.me/' + source_url, function (err, data) {
      if (err) throw err;
      JSZip.loadAsync(data).then(function (zip) {
        Object.keys(zip.files).forEach(function (key) {
          zip.file(key).async("string").then(function (content) {
            callback(content);
          });
        });
      });
    });
  }
  var sample = function () {
    var function_name = '<Lambda関数名>';
    get_source_url(function_name, function (source_url) {
      show_code(source_url, function (content) {
        console.log(content);
      });
    })
  }();
</script>

松木佑徒

目次