ソモサン

私rohkiによる活動や読書の記録をつらつらと書くページです

CodeStar で AWS Lambda + Golang の雛形をサクッと作成してみた

前回 Golang サポートしたらやってみるといってたので、まずは雛形作成と調査だけ。Golang しっかり書いたことないですし。

CodeStar で雛形作成

AWS Lambda Supports Go をよむと CodeStar に対応しているぜー とかいてあったので、そちらで作りました。

f:id:rohki:20180116211837p:plain

github.com

物としては、API Gateway 経由で起動して、ローカルファイルを読み込んで返す Lambda でした。
仕組みについてはこちらをありがたく読ませていただきました。

CodeStar のよかったところ: クロスコンパイラ環境の準備と設定ができてる

CodeStar の利点としてはビルドやデプロイの設定がしてあることですね。とくにクロスコンパイラ環境。
家に帰る途中で調査の段取り考えてた時に、ビルド環境の準備面倒そうだなーとか思ってたので。
実際は $ GOOS=linux GOARCH=amd64 で行けるので手間でない模様。

雑感

バイナリサイズ: 2.4 MB

このぐらいのサイズにはなりますよね。

cold 状態からの起動による遅延: 感じられず

おそらく数ミリ秒

つづく

こちら にて紹介いただいていた sdkFirehose のイベント定義 もありました。
書くぞー計測するぞー

Kinesis Firehose のデータ変換を Rust でやってみて速度向上が見込めた話

概要

Rust コードを Lambda 上で動かせたーと喜んだんですが、活用どころあるんだろうかと考えてみて検証してみました。
結果として Python 比較で1秒当たりで 15 倍ほど多く処理できました。
以下でつらつらと書いていってます。

続きを読む

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% の確率で行くよう設定します。

f:id:rohki:20171201230126p:plain

あとはひたすらポチポチ実行。

f:id:rohki:20171201230439p:plain

おー、できました。無理やり感が否めないですが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 にあげてくれるやつが書けるかも…

楽しくなってまいりました。

Swagger を使って ChatWork といろんなサービスをつなげてる (条件付き)

ChatWork とほかのサービスを連携させようとする場合、選択肢は Zapier か自前実装かと思ってます。
で、そこでタイトルにある第3の選択。Swagger があればどうにかなる。MS Flow のカスタムコネクタで。

続きを読む