API Gateway の Kinesis Proxy で追跡性をちょこっと上げてみる
結論
本文マッピングテンプレートを以下のようにします
#set($inputRoot = $input.path('$')) #define ($data){"requestId": "$context.requestId","data": "$inputRoot"}#end { "StreamName": "STREAM_NAME", "Data": "$util.base64Encode($data)", "PartitionKey": "KEY" }
これでリクエストの ID がとれ、後の処理の追跡がしやすくなる…はず?
設計に応じて、ステージ名とかパスとか入れるとよさそうです。
参考にさせてもらったところ
Amazon Kinesis プロキシとして API Gateway API を作成する - Amazon API Gateway
API Gatewayへの入力値にLambdaからアクセスする - Qiita
蛇足1: ちょっとめんどくさかった Json 文字列の作成
Kinesis Proxy の Data
は Base64 でエンコードされてる必要があります。よって、先に JSON 文字列を作ってやる必要がありました。
が、このやり方がひたすら謎で迷走してました。Velocity Template Language
てなんやねん…
結局は #define
でできました。
Apache Velocity Engine VTL Reference
ほかに試したこと
#set ($data = ...)
でいれてみる
-> ダブルクォート なしのやつが出来上がる- さらに
$data.json()
とかしてみる
-> 空文字が返ってくる #set ($data = ...)
の際に '"" をエスケープして追加してみる
-> いんたーなるさーばーえらー
蛇足2:本当は X-Ray の Trace Id がほしかった
API Gateway からの応答には入っていたので、$input.param('X-Amzn-Trace-Id')
と書けばとれたりするかなー、と思ったりしましたがだめでした。
これが取れると X-Ray での描画ができてさらに便利になるやん、と期待してたりしました。
CodeStar で AWS Lambda + Golang の雛形をサクッと作成してみた
前回 Golang サポートしたらやってみるといってたので、まずは雛形作成と調査だけ。Golang しっかり書いたことないですし。
CodeStar で雛形作成
AWS Lambda Supports Go をよむと CodeStar に対応しているぜー とかいてあったので、そちらで作りました。
物としては、API Gateway 経由で起動して、ローカルファイルを読み込んで返す Lambda でした。
仕組みについてはこちらをありがたく読ませていただきました。
CodeStar のよかったところ: クロスコンパイラ環境の準備と設定ができてる
CodeStar の利点としてはビルドやデプロイの設定がしてあることですね。とくにクロスコンパイラ環境。
家に帰る途中で調査の段取り考えてた時に、ビルド環境の準備面倒そうだなーとか思ってたので。
実際は $ GOOS=linux GOARCH=amd64
で行けるので手間でない模様。
雑感
バイナリサイズ: 2.4 MB
このぐらいのサイズにはなりますよね。
cold 状態からの起動による遅延: 感じられず
おそらく数ミリ秒
つづく
こちら にて紹介いただいていた sdk にFirehose のイベント定義 もありました。
書くぞー計測するぞー
Q. 2017/12/9 の AWS Lambda の OpenSSL のバージョンは?
import ssl def lambda_handler(event, context): return ssl.OPENSSL_VERSION
チェック!
結果: "OpenSSL 1.0.0-fips 29 Mar 2010"
おし、めんどくさくなってきた。
情報元:
OpenSSL 1.0.2 Shared Library missing · Issue #855 · Miserlou/Zappa · GitHub
AWS Lambda の Traffic Shifting Using Aliases で無理やり Chaos Engineering
できんじゃねと思ったらできました。無理やり。
この間発表された AWS Lambda の更新で、エイリアスに対して割合で別バージョンを割り振ることができるようになりました。
ユースケースとしては Canary や Blue/Green が上がってたんですが、Chaos もいけんじゃねと思ってやってみたら一応できました。
正常なコードが以下です。バージョン 1 です。
import json print('Loading function') def lambda_handler(event, context): #print("Received event: " + json.dumps(event, indent=2)) print("value1 = " + event['key1']) print("value2 = " + event['key2']) print("value3 = " + event['key3']) return event['key1'] # Echo back the first key value #raise Exception('Something went wrong')
異常なコードが以下です。バージョン 2 です。
なんも考えてません。例外はくだけ。
import json print('Loading function') def lambda_handler(event, context): raise Exception('Something went wrong')
んで、エイリアス chaos
をつくり、バージョン 2 へ 5% の確率で行くよう設定します。
あとはひたすらポチポチ実行。
おー、できました。無理やり感が否めないですがw
例外パターンを最初に考えないときつそうかなー。
あとどうやって例外バージョンを指定して割り振るかってのが難しそう。
ただ形にできると発展も効きそうです。ひたすらスリープして落ちるとか。
Serverless のプラグインとかですかね?
Rust の ライブラリ Rusoto を使って AWS サービスにアクセスする
表題にあるとおり、Rust から AWS にアクセスするための SDK を大分前にメモしていたので試した、という話。
extern crate rusoto_core; extern crate rusoto_s3; use rusoto_s3::{S3, S3Client}; use rusoto_core::{DefaultCredentialsProvider, Region}; use rusoto_core::default_tls_client; fn main() { let provider = DefaultCredentialsProvider::new().unwrap(); let client = S3Client::new(default_tls_client().unwrap(), provider, Region::ApNortheast1); match client.list_buckets() { Ok(output) => { match output.buckets { Some(bucket_name_list) => { println!("Tables in database:"); for bucket in bucket_name_list { println!("{:?}", bucket.name); } } None => println!("No tables in database!"), } } Err(error) => { println!("Error: {:?}", error); } } }
S3 のバケット列挙がこんな具合。
対応状況曰く、今のところ安定しているのが、
- EC2
- ECS
- DynamoDB
- ETS
- KMS
- SQS
らしいってS3入ってないじゃん!動いたよ上のコード!
と、ということはログを受けまくって AWS にあげてくれるやつが書けるかも…
楽しくなってまいりました。