Lambdaで個人用Gyazoを作った
非常に今更感満載なネタですがご了承下さいw
はじめに
ブログ記事を書くときのスクショをGyazoを使って撮っていたんですが、画像のURLを取得するのが地味に手間でどうにかできないかと思っていました
(無料で使っているのに文句言うなというご意見はごもっともです…)
少し前だとDropboxを使ったGyazo Serverにすることができたみたいですが、今は色々と試した感じ出来なさそうだったので断念しました
何かいい方法はないかと調べてみると
- herokuを使ってS3にアップロードする
- gyazo clientに認証情報を持たせる
- 自前で作る
- etc
と色々とあったんですが、どれも一長一短でどうしようかなと悩んでいました
昨年末にLambdaを使ってアプリケーションを使ってみたので今回もLambdaで作ってみることにしました
Lambda×ALB (ボツ案)
同じ構成で作ってもいたんですが、ALBのターゲットにLambdaが使えるようになった事を思い出して使ってみることにしました
ALBではBodyがbase64でencodeされてくるので
body := []byte(b)
if isBase64Encoded {
dBody, err := base64.StdEncoding.DecodeString(b)
if err != nil {
return nil, pkgerr.Wrap(err, "decode body failed")
}
body = dBody
}
req, err := http.NewRequest(
strings.ToUpper(method),
path,
bytes.NewReader(body),
)
if err != nil {
return nil, pkgerr.Wrap(err, "new request failed")
}
こんな風にhttp.Requestに組み立ててあげる必要があります
ハマりポイントはそれぐらいで、あとはLambdaでアプリケーションを作る場合とほとんど変わりませんでした
が、この案は💸的にボツになりました
そこまでかかる訳ではないが、ALBの費用がコスパ的に良くないのでやめました
API Gateway × Lambda
ということで前回と同じやり方に戻ってきました
ただAPI Gateway経由だとLambdaに画像データが渡ってこなくて結構嵌りました
調べたらバイナリを渡すには別途設定が必要でした
この設定をすればあとはALBと同様の処理で問題なかったです
Lambdaとの設定はこんな感じ
最後にGyazo.app/Contents/Resources/script
のHOSTを自分で修正してあげれば完了🆗
さいごに
- Lambdaのデプロイを自動化したい
- コードはそのうち公開予定
- 現状エンドポイントとパスがわかってしまったら誰でもアップロードできてしまうので、もう少しセキュアにアップロードできる仕組みを考えたい
- まずは画像がいきなり増えてないか監視するところか??
- マネージドはやっぱり便利
参考
- アプリケーションロードバランサー(ALB)のターゲットにAWS Lambdaが選択可能になりました
- k0kubun/lambda-gyazo-s3
- AWS Application Load BalancerのターゲットにLambda(Python)を指定してみた
- github.com/myshenin/aws-lambda-multipart-parser
Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版
posted with amazlet at 19.02.18
玉川憲 片山暁雄 今井雄太 大澤文孝
日経BP社
売り上げランキング: 7,005
日経BP社
売り上げランキング: 7,005