Konboi Note

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に画像データが渡ってこなくて結構嵌りました

調べたらバイナリを渡すには別途設定が必要でした

img

この設定をすればあとはALBと同様の処理で問題なかったです

Lambdaとの設定はこんな感じ

img

最後にGyazo.app/Contents/Resources/script のHOSTを自分で修正してあげれば完了🆗

さいごに

  • Lambdaのデプロイを自動化したい
  • コードはそのうち公開予定
  • 現状エンドポイントとパスがわかってしまったら誰でもアップロードできてしまうので、もう少しセキュアにアップロードできる仕組みを考えたい
    • まずは画像がいきなり増えてないか監視するところか??
  • マネージドはやっぱり便利

参考



Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版
玉川憲 片山暁雄 今井雄太 大澤文孝
日経BP社
売り上げランキング: 7,005