API Gateway + Lambda で固定のパラメータを付加して HTTP Proxy する

API Gateway による HTTP Proxy は作例がたくさんある (というかコンソールぽちぽちするだけで作れる) のだけど、endpoint 側に Query String を渡す際に、client から渡ってきていないパラメータを追加しようとすると素直にはいかなかったのでメモ。

やりたかったこと

  1. 下図の (a) で zipcode=hoge が渡ってくる
  2. (b) で zipcode=hogezn=hoge にした上で、
  3. 更に 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つの設定を行います。

  1. Method Request の URL Query String Parameters に受け取るパラメータを追加
    • zipcode f:id:chrolis:20151117180401p:plain
  2. Integration Request に Mapping Templates を設定
    • Content-Type: application/json
    • { "zipcode": $input.params("zipcode") }
      ( ちなみにシングルクオートだと上手くいかなかった )
      f:id:chrolis:20151117180410p:plain

上記の例に従った場合、Method Test の結果がこんな感じになれば成功しています。

f:id:chrolis:20151117180429p:plain

Charlotte オリジナルサウンドトラックの Bravely You にはクリッピングがない

(Twitterはあとから遡るの大変なので参照だけ貼っておく)

afconvertの記事 で触れていますが、Charlotte OSTに収録されている Bravely You にはクリッピングが皆無です。(参考リンク: Kazukitiブログ!: CharlotteのOP/EDのBravely You/焼け落ちない翼の音割れが酷すぎる…)

というわけで綺麗な Bravely You が聴きたかったらサントラ買えばいいんじゃないかな!

TVアニメ「Charlotte」 Original Soundtrack

TVアニメ「Charlotte」 Original Soundtrack

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'

で、音割れはどうだったの

ちなみに比較結果はこんな感じでした。

  • 追記: m4a そのままでも読めました