Slide 1

Slide 1 text

© 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 Go CDK を触ってみた LT デザミス株式会社 2021.5.28 Developer Preview

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

2 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 牛に付けたセンサーで体調管理ができる IoT サービスを作っています ちなみに弊社...

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

4 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 cdk init --language=go Go CDK やってみた

Slide 6

Slide 6 text

5 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 なんかエラーでた Go CDK やってみた ※ v1.105.0 では問題が 解消されていました

Slide 7

Slide 7 text

6 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 でもファイルはできてる! Go CDK やってみた

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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 割と⼈気なテストフレームワーク

Slide 10

Slide 10 text

9 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 NewHelloCdkGoStack() hello-cdk-go.go

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

11 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 main() hello-cdk-go.go

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

13 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 テストコード hello-cdk-go_test.go

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

15 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 デプロイしてみる おそるおそる cdk synth

Slide 17

Slide 17 text

16 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 デプロイしてみる なんかエラーでた

Slide 18

Slide 18 text

17 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 デプロイしてみる (JU)VCד *TTVFT׾嗚稊ծBXTBXTDEL ח֮׷أُ٦ءّٝ׾鑐׃ג׫׋

Slide 19

Slide 19 text

18 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 デプロイしてみる DEL TZOUI䧭⸆

Slide 20

Slide 20 text

19 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 デプロイしてみる DEL EFQMPZ䧭⸆

Slide 21

Slide 21 text

20 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 デプロイしてみる $MPVE'PSNBUJPOأةحؙ׮然钠

Slide 22

Slide 22 text

21 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 いま多分 このあたり 完全に理解した

Slide 23

Slide 23 text

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 で書きたい!

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

24 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 API の歩き方 Lambda をスタックに加えるには 左メニューから Directories をクリック ”awslambda” がそれっぽい

Slide 26

Slide 26 text

25 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 awslambda.NewFunction() を使ってみた Lambda をスタックに加えるには FunctionProps が キモになりそうだ

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

27 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 ➂➂➂➂➂➂➂➂  瑱搫ך Python  Y^Y^Y^Y^Y^Y^Y^Y Lambda をスタックに加えるには

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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、デプロイ!

Slide 31

Slide 31 text

30 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 デプロイ成功! Go Lamba のデプロイ

Slide 32

Slide 32 text

31 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 テストも成功! Go Lamba のデプロイ

Slide 33

Slide 33 text

32 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 いま多分 このあたり 完全に理解した

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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 したやつは⼿動で消さないと…

Slide 36

Slide 36 text

35 © 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 おまけ: 全部にタグをつける ばっちり!! Tag_Of() ← Go 的にはすごく変な名前…

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

© 2021 DESAMIS Co., Ltd. 無断での引用、 転載を禁じます。 Thank you! デザミス株式会社 www.desamis.co.jp