Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introducing Go CDK (Developer Preview)

Introducing Go CDK (Developer Preview)

とあるイベントにて LT で発表した資料 (公開バージョン) です。
2021年4月に登場した AWS CDK の Go バインディング (現在 Developer Preview) を使って Go 製 Lambda のデプロイにチャレンジ+αします。

Yutaka Kato

May 28, 2021
Tweet

More Decks by Yutaka Kato

Other Decks in Technology

Transcript

  1. 1 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 Go CDK

    とは CDK が Go で書ける! 4/30 発表!ナウい! Developer Preview!
  2. 3 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 社内では Heroku

    と Ruby が大人気、一方私は AWS や Go を使って仕事をすることが多い 社内での IaC と Go の位置づけ 38 関数 SAM 率 32% Go 率 24% 5 サービス CDK 率 60% Go 率 100% Lambda ECS/Fargate Heroku 43 App No IaC Go 率 7% 1 サービス No IaC Go 率 100% App Runner
  3. 5 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 なんかエラーでた Go

    CDK やってみた ※ v1.105.0 では問題が 解消されていました
  4. 7 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 生成された cdk.json

    と go.mod cdk.json go.mod (依存ライブラリ等を定義したファイル)
  5. 8 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 生成された cdk.json

    と go.mod aws-cdk-go CDK 本体の Go バインディング constructs-go CDK の基盤である constructs プログラミングモ デルの Go バインディング jsii-runtime-go JavaScript クラスを他の⾔語と相互運⽤できる ようにする jsii ライブラリ⽤の Go モジュール gjson JSON をサクッと触れる便利ライブラリ testify 割と⼈気なテストフレームワーク
  6. 10 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 NewHelloCdkGoStack() hello-cdk-go.go

    無名フィールドで埋め込み ポインタで受けるので nil チェック CloudFormation スタック jsii.String() は⽂字列のアドレス を取って返すだけの関数 SNS トピック作成 Go っぽい!
  7. 12 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 main() hello-cdk-go.go

    NewApp() の返却値は App インタフェースの実装 プロパティはアドレスで渡す いつものやつ 違和感なし!
  8. 14 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 テストコード hello-cdk-go_test.go

    テンプレートをこの場で⽣成、JSON 解析 SNS トピックが⼊っているか検査 可読性⾼い! main() と同様にスタック構築
  9. 22 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 伏線回収 Go

    CDK で Go の Lambda をデプロイしたい 38 関数 SAM 率 32% Go 率 24% Lambda 全ての Go の Lambda は 現在 SAM でデプロイしている SAM のツールチェインは素晴らしいが、Lambda 界隈から⼀歩出ると ただの CloudFormation 筋トレ⼤会になってしまう @aws-cdk/aws-sam という選択肢もあるけれど、ツールが増えて環境構築 の⼿間が増えたり取り扱う⾔語が増えたりする⽅法は同僚に勧めづらい Go Lambda も IaC も全部 Go で書きたい!
  10. 23 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 API の歩き方

    Lambda をスタックに加えるには 使いたいのは @aws-cdk/aws-lambda だが… Go の API は pkg.go.dev で調べよう
  11. 24 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 API の歩き方

    Lambda をスタックに加えるには 左メニューから Directories をクリック ”awslambda” がそれっぽい
  12. 25 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 awslambda.NewFunction() を使ってみた

    Lambda をスタックに加えるには FunctionProps が キモになりそうだ
  13. 26 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 ここで aws-cdk-examples

    につい最近 go ディレクトリが追加されていたことを発見! Lambda をスタックに加えるには
  14. 27 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 ➂➂➂➂➂➂➂➂ 

    瑱搫ך Python  Y^Y^Y^Y^Y^Y^Y^Y Lambda をスタックに加えるには
  15. 28 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 サンプルも参考につつつデプロイしたいのは Go

    の Lambda なので Code, Handler, Runtime を変更 Lambda をスタックに加えるには 実⾏バイナリは zip で渡す 実⾏バイナリファイル名 Go ランタイム指定 相変わらずポインタだらけ…
  16. 29 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 Go Lamba

    のデプロイ Lambda 本体はシンプルに % GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o hello cmd/hello/main.go % zip hello hello.zip % cdk deploy Lambda クロスコンパイル、zip、デプロイ!
  17. 33 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 おまけ: Context

    を使ってみる Go CDK の場合は App インタフェースの Node().TryGetContext() を使う しかし戻り値が interface{} (TS でいう Any みたいなやつ) なので string に型アサーション... とりあえず関数名やスタック名などに刺してみた IaC を導入する大きなモチベーションの一つが「開発/本番一致」の実現、Context で環境を指定できるように
  18. 34 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 おまけ: Context

    を使ってみる 無事に開発・ステージング・本番が 1 CDK ソースで完成! % cdk –c stage=dev deploy % cdk –c stage=stg deploy % cdk –c stage=prod deploy CloudFormation スタック⼀覧 Lambda 関数⼀覧 Context 実装前に deploy したやつは⼿動で消さないと…
  19. 36 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 まとめ •

    言語バインディングの薄皮さえ突破できれば後は普通の CDK と同じ • ちょくちょくハマりどころがあるのも普通の CDK と同じ • API は膨大で正直探しづらさもあるので、今後サンプルの充実などが望まれる • ポインタこてこてな API の使い勝手は微妙 (aws-sdk-go にもいえる) • でもやっぱり楽しい!
  20. 37 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 Preview ながら十分な情報源があり検証の助けになりました

    参考になったもの • Getting started with the AWS Cloud Development Kit and Go https://aws.amazon.com/jp/blogs/developer/getting-started-with-the-aws-cloud-development-kit-and-go/ • aws/aws-cdk-go: AWS CDK bindings for Go. https://github.com/aws/aws-cdk-go • awscdk · pkg.go.dev https://pkg.go.dev/github.com/aws/aws-cdk-go/awscdk • aws-samples/aws-cdk-examples: Example projects using the AWS CDK https://github.com/aws-samples/aws-cdk-examples
  21. 38 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 自己紹介 ⸇谏

    酔 ,BUP:VUBLB رؠىأ吳䒭⠓爡 ءص، *P5ألءٍٔأز ⻌ꤵ⯓畭猰㷕䪮遭㣐㷕ꤍ㣐㷕 +"*45 䎃⼼ 醱さ堣ً٦ؕ٦ךٔ؝٦ד穈鴥׫اؿزؐؑ،Ꟛ涪׾穗꿀䖓ծؙٓؐسكٝت٦װ *P5؎ٝذؚٖ٦ة٦׾穗ג 䎃رؠىأחⰅ爡 䚈慧ח㟓ִ׷ *P5堣㐻ך盖椚٥湊鋔㛇湍׾Ꟛ涪 今⽇紹介した Go CDK + Go Lambda の完全なデモはこちらにあります: https://github.com/mikan/go-cdk-lambda-demo