API Gateway + Lambda で固定のパラメータを付加して HTTP Proxy する
API Gateway による HTTP Proxy は作例がたくさんある (というかコンソールぽちぽちするだけで作れる) のだけど、endpoint 側に Query String を渡す際に、client から渡ってきていないパラメータを追加しようとすると素直にはいかなかったのでメモ。
やりたかったこと
- 下図の (a) で
zipcode=hoge
が渡ってくる - (b) で
zipcode=hoge
をzn=hoge
にした上で、 更に
ver=0
というパラメータを追加したい| --(a)-> | | --(b)-> | Client | | API | | GET | | Gateway | | http://exmaple.com/api/ | <------ | | <------ |
どうすればいいのか
Lambda で HTTP Proxy 的な処理を書いて GET させるとよい。
詳細は以下のとおりです。 なお、記事にするにあたり 郵便番号検索API を利用させて頂きました。
Integration type: HTTP Proxy だとダメ
Integration type: HTTP Proxy にすると、client から渡ってきた Query String を endpoint に渡す 際、key は変更できるものの、value を変えたり、特定の key を静的に(=固定で)指定といったことはできないようです。
よって、"更にパラメータを追加" するには他の手段をとる必要がありそうです。
Lambda を使う
やや面倒ではあるものの、API Gateway に用意されている HTTP proxy ではなく、Lambda を経由して GET させてみました。
以下は Lambda のコードです。
var request = require('request'); exports.handler = function(event, context) { // endpoint 側に渡すパラメータ // event には Mapping Template に記述した内容が渡ってくる var params = { zn:event.zipcode, ver:'0' }; // コンテンツをパラメータ付きで get request.get({url:"http://zip.cgis.biz/xml/zip.php", qs: params}, function(err, res, body) { if (!err && res.statusCode == 200) { context.done(null, body); } else { console.log('error: '+ res.statusCode); } }); };
request モジュールを要求するため、AWSへは node_modules を含む zip ファイルとしてアップロードします。
npm install request zip -r zipcode.zip index.js node_modules
API Gateway の設定
(APIやResourcesの作成などの基本的な設定は省略します。)
Method Execution には以下の2つの設定を行います。
- Method Request の URL Query String Parameters に受け取るパラメータを追加
zipcode
- Integration Request に Mapping Templates を設定
- Content-Type:
application/json
{ "zipcode": $input.params("zipcode") }
( ちなみにシングルクオートだと上手くいかなかった )
- Content-Type:
上記の例に従った場合、Method Test の結果がこんな感じになれば成功しています。
Charlotte オリジナルサウンドトラックの Bravely You にはクリッピングがない
(Twitterはあとから遡るの大変なので参照だけ貼っておく)
afconvertの記事 で触れていますが、Charlotte OSTに収録されている Bravely You にはクリッピングが皆無です。(参考リンク: Kazukitiブログ!: CharlotteのOP/EDのBravely You/焼け落ちない翼の音割れが酷すぎる…)
Bravely You のゲイン比較。赤い部分がクリッピング発生箇所。上からシングル版、iTunes配信版、サウンドトラック版。シングル版の酷さが際立つ pic.twitter.com/T6MwxexsBR
— Chrolis (@chrolis) 2015, 11月 10
というわけで綺麗な Bravely You が聴きたかったらサントラ買えばいいんじゃないかな!
TVアニメ「Charlotte」 Original Soundtrack
- アーティスト: Charlotte
- 出版社/メーカー: Aniplex (music)
- 発売日: 2015/11/04
- メディア: CD
- この商品を含むブログ (3件) を見る
Last Login message が出なくなったのをやや暴力的に解決した
OSXのターミナル(iTerm2やTerminal.app)を利用していると、
初回ログインでない限りは新規ウィンドウ/タブを開くと
Last login: Tue Nov 10 22:24:14 on console
みたいなメッセージが出るんですが…
今日のある時点から、なんだかターミナルに違和感を感じるなと思ったら、このメッセージが出力されなくなっていました。
対処
/var/log/asl/*.asl
を削除してOSを再起動したところ出力されるようになった。sudo rm /var/log/asl/*.asl
補足
- Last Login 情報は
/var/log/asl/*.asl
を読んでいるらしいという情報を得て/var/log/asl/
を確認してみると、25MB程ある .asl ファイルが10個ほど溜まっていた - ファイル名からして恐らくローテートされたものではあるものの、それにしても短時間でローテートされているのでなんだかおかしそう
- 後先考えずとりあえず消してみたところ直った
…という、やや暴力的な解決方法でした。
最初は .asl ファイルが壊れているのかなとも思ったものの、そもそも読む方法が分からず。
もし詳しい方が居たら教えて頂けるとうれしいです。
afconvert が便利な話
Charlotte のサントラを買った!!
先日 Charlotte のサントラを購入しました。
せっかくなのでBravely You の音割れの件も確認しておこうと、左記記事でも利用されているAudacityを導入してみたのですが、iTunes配信版と比較する場合、m4a なので直接は読めません→読めました。
コマンドラインで変換できないものか調べていると、なんと OSX には afconvert
とやらが最初から入っているではありませんか。
afconvert すごい
さて、afconvert
を使って m4a から aiff に変換するわけですが、対応フォーマットを見る限り、OSX上での音声ファイル形式の変換はこれさえあれば足りそうな印象。
(*'-') < afconvert -hf 2>&1 | grep = '3gpp' = 3GP Audio (.3gp) '3gp2' = 3GPP-2 Audio (.3g2) 'adts' = AAC ADTS (.aac, .adts) 'ac-3' = AC3 (.ac3) 'AIFC' = AIFC (.aifc, .aiff, .aif) 'AIFF' = AIFF (.aiff, .aif) 'amrf' = AMR (.amr) 'm4af' = Apple MPEG-4 Audio (.m4a, .m4r) 'm4bf' = Apple MPEG-4 AudioBooks (.m4b) 'caff' = CAF (.caf) 'ec-3' = EC3 (.ec3) 'MPG1' = MPEG Layer 1 (.mp1, .mpeg, .mpa) 'MPG2' = MPEG Layer 2 (.mp2, .mpeg, .mpa) 'MPG3' = MPEG Layer 3 (.mp3, .mpeg, .mpa) 'mp4f' = MPEG-4 Audio (.mp4) 'NeXT' = NeXT/Sun (.snd, .au) 'Sd2f' = Sound Designer II (.sd2) 'WAVE' = WAVE (.wav)
実際に変換してみる
afconvert
による変換には output format (-f
) と data format (-d
) の指定が必要になります。
入力ファイルのビット深度は afinfo
で確認できます。
(*'-') < afinfo '01 Bravely You.m4a' | grep depth source bit depth: I16
上記がわかればあとはこんな感じで変換
(*'-') < afconvert -f AIFF -d BEI16 '01 Bravely You.m4a' '01 Bravely You.aiff'
で、音割れはどうだったの
ちなみに比較結果はこんな感じでした。
上が配信版(iTunes)、下がCharlotteOST収録版。OST版はクリッピング皆無ですね pic.twitter.com/txNikalnGB
— Chrolis (@chrolis) 2015, 11月 10
- 追記: m4a そのままでも読めました