必要なライブラリを読み込む
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>
松木佑徒