必要なライブラリを読み込む
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> |
この記事を書いた人
最近書いた記事
- 2021.12.10React NativeでWallet風UIを実装する
- 2018.11.19Elasticsearchで簡単な検索とscoreを調整する方法
- 2018.10.05ECSをEC2からFargateに切り替える際の注意点
- 2018.09.12AKB48グループ映像倉庫のWeb版をリリースしました