Slide 1

Slide 1 text

WingLangでインフラとアプリを同時にコード化! 
 IfCツールを体験してみよう
 hibiya.tech #4
 塚本太朗
 1

Slide 2

Slide 2 text

2 自己紹介 塚本太朗 入社: 2023年5月 所属: CX事業本部 リテールアプリ共創部 趣味: ちょこザップ @9Lgo1 engineer-taro Practitioner

Slide 3

Slide 3 text

3 クラウド環境で開発するときの困りごと

Slide 4

Slide 4 text

4 クラウド環境での開発フロー 実装して単体テストまで通った、デプロイするぞ! → デプロイ完了まで10分待つ → 動作確認すると失敗 → 原因っぽいIAMポリシーを修正して再度デプロイ → デプロイ完了まで10分待つ → 動作確認...

Slide 5

Slide 5 text

5 なぜこんなことが起こるのか?

Slide 6

Slide 6 text

6 単体テストで動作が担保されるのはアプリケーションのコー ド インフラの動作確認をローカルで行うことはできない “プログラミング言語はコンピューターが単一のマシンである という前提で設計されている” https://www.winglang.io/blog/2022/11/23/manifesto#compilers-to-therescue

Slide 7

Slide 7 text

7 そこで Wing !

Slide 8

Slide 8 text

8 Wingとは? 新たなプログラミング言語 “cloud-oriented programming language.” ざっくり歴史 2022年: AWS CDKの産みの親 Erad Ben-Israel と Shai Ber が Wing Cloud を設立 2023年: 2000万ドルの資金調達 現在(2024/03/21): バージョン0.62.2 (ベータ版) 1日に10回程度更新されるほど継続的に開発          

Slide 9

Slide 9 text

9 Slackに参加すればCDKの生みの親の誕生日を祝える!


Slide 10

Slide 10 text

10 Wing が解決したいこと 1. Try&Errorサイクルのスピードを上げる 2. クラウド特有の知識がなくても開発できる 3. 別クラウドでも同一コードでデプロイできる(未)

Slide 11

Slide 11 text

11 Wing が解決したいこと 1. Try&Errorサイクルのスピードを上げる 2. クラウド特有の知識がなくても開発できる 3. 別クラウドでも同一コードでデプロイできる(未)

Slide 12

Slide 12 text

12 ローカルで動作するシミュレーター

Slide 13

Slide 13 text

13 Wing が解決すること 1. Try&Errorサイクルのスピードを上げる 2. クラウド特有の知識がなくても開発できる 3. 別クラウドでも同一コードでデプロイできる(未)

Slide 14

Slide 14 text

14 この構成を作るのに...

Slide 15

Slide 15 text

15 IAM, APIGateway, Lambda がコードに登場しない bring cloud; bring ex; bring util; let api = new cloud.Api(); api.get("/users/:id", inflight (request: cloud.ApiRequest): cloud.ApiResponse => { let id = request.vars.get("id"); return cloud.ApiResponse { status: 200, body: Json.stringify({message: "SUCCESS {id}"}) }; });

Slide 16

Slide 16 text

16 Wing が解決すること 1. Try&Errorサイクルのスピードを上げる 2. クラウドサービスの知識がなくても開発できる 3. 複数クラウドに1ソースでデプロイ可能(予定)

Slide 17

Slide 17 text

17 異なるクラウドのTerraformテンプレートを生成 (開発予定 Azure, gcp) wing compile --platform tf-aws main.w

Slide 18

Slide 18 text

18 TODOアプリのAPIを作ってみた ソース

Slide 19

Slide 19 text

19 1. 実装 2. シミュレータ 3. デプロイ

Slide 20

Slide 20 text

20 Table, APIを定義 let tasks = new ex.Table( name: "Tasks", columns: { "id" => ex.ColumnType.STRING, "title" => ex.ColumnType.STRING }, primaryKey: "id" ) as "taskTable"; let counter = new cloud.Counter(); // あとで解説 let api = new cloud.Api(); let path = "/tasks";

Slide 21

Slide 21 text

21 GETメソッド(一覧取得)を定義 api.get( path, inflight (request: cloud.ApiRequest): cloud.ApiResponse => { let rows = tasks.list(); let var result = MutArray[]; for row in rows { result.push(row); } return cloud.ApiResponse{ status: 200, headers: { "Content-Type" => "application/json" }, body: Json.stringify(result) }; });

Slide 22

Slide 22 text

22 POST, PUT, DELETE も同じように定義 (GitHubリポジトリ参照)

Slide 23

Slide 23 text

23 1. 実装 2. 動作確認 3. デプロイ

Slide 24

Slide 24 text

24 シミュレータで動作確認

Slide 25

Slide 25 text

25 1. 実装 2. シミュレータ 3. デプロイ

Slide 26

Slide 26 text

26 デプロイ wing compile --platform tf-aws main.w // 以下 Terraformの世界 terraform init terraform apply

Slide 27

Slide 27 text

27 APIGateway

Slide 28

Slide 28 text

28 DynamoDB

Slide 29

Slide 29 text

29

Slide 30

Slide 30 text

30 PostmanでAPI実行: 登録

Slide 31

Slide 31 text

31 PostmanでAPI実行: 取得

Slide 32

Slide 32 text

32 ぶっちゃけ感想

Slide 33

Slide 33 text

33 ● コンセプトに共感できる、引き続き追っていきたい ● ローカルシミュレータでの開発体験が良い ● 少ない記述で よしなに設定値を定義してくれる ● 新しい言語なのでフォーマッタなどが存在しない ● 「異なるクラウドにコード1つで」は難しそう ● 実際使えるようになるまで、かなり時間がかかりそう ● 細かい設定値を調整できない(調整しなくて済むために開 発されている)

Slide 34

Slide 34 text

34 ● コンセプトに共感できる、引き続き追っていきたい ○ 開発が頓挫する可能性はあるが、何かしら副産物が産まれそ う

Slide 35

Slide 35 text

「異なるクラウドにコード1つで」は難しそう ○ すでにDynamoDB用のリソースがある ○ クラウド間の差異を吸収するのは難しい 35

Slide 36

Slide 36 text

36 シミュレータ触りたい方いれば、 お声がけください!

Slide 37

Slide 37 text

37 Wingのブログは引き続き何本か書きます!

Slide 38

Slide 38 text

38

Slide 39

Slide 39 text

Appendix
 3

Slide 40

Slide 40 text

40 VPC Lambdaなども設定もできる(現状設定値はわずか) https://www.winglang.io/docs/platforms/tf-aws#parameters

Slide 41

Slide 41 text

41 プロキシ統合の設定がデフォルトになっている