Slide 1

Slide 1 text

AWS CDK on Scala Scalaでインフラ管理してみたはなし 2020-09-25 scala.tokyo オンライン @nomadblacky

Slide 2

Slide 2 text

Takumi Kadowaki 株式会社セプテーニ・オリジナル所属 自称 : Full "stuck" Scala Engineer Scala でなんでもやりたいひと おしごと : データ基盤の SRE ● GitHub: NomadBlacky ● Twitter: @nomadblacky Ammonite で Scala スクリプトに入門する本出しました→ だれ?

Slide 3

Slide 3 text

● 株式会社セプテーニ・オリジナルについて ● AWS CDK の簡単な概要 ● AWS CDK を Scala プロジェクトで扱う方法 ● GitLab CI を使った Continuous Deployment の実現方法 やってみたレベルの話なので深い話はあまりしません 今回話すこと

Slide 4

Slide 4 text

株式会社セプテーニ・オリジナルについて

Slide 5

Slide 5 text

セプテーニグループのシステム開発会社

Slide 6

Slide 6 text

セプテーニ・オリジナルの3大事業

Slide 7

Slide 7 text

Scalaの使いどころ ● バックエンド ○ Play Framework, Akka HTTP ● データ取得バッチ ○ Akka Stream ● ETL ○ AWS Glue (Spark) ● インフラ (new??) ○ AWS CDK

Slide 8

Slide 8 text

https://www.septeni-original.co.jp/recruit/ Scala エンジニアほか、 複数ポジションで採用募集中!

Slide 9

Slide 9 text

AWS CDK について

Slide 10

Slide 10 text

AWS CDK について ● 既存のプログラミング言語を使って AWS のクラウドリソースを定義、 プロビジョニングするためのツール ○ いわゆる Infrastructure as Code ● 対応言語 ○ TypeScript, Python, .NET, Java ← Scala から使える ! ● 各言語で定義したモデルが CloudFormation のテンプレートに変換される ● アプリケーションを一緒にデプロイする機能 ○ インフラのプロビジョニング → アプリケーションのデプロイ という 2 段階の手順を踏む必要がなくなる ○ CDK のデプロイが完了した時点でアプリケーションが動作する完全な状態になる

Slide 11

Slide 11 text

デモ: FargateにScalaアプリをデプロイしてみる いきなり説明されても実感が湧きにくいので … まずは動くところを見てみる すぐに AWS 環境にデプロイ可能な Giter8 テンプレートを作りました NomadBlacky/aws-cdk-scala_fargate-simple-web-app.g8 Scala で実装した Web アプリケーションを AWS Fargate にデプロイする

Slide 12

Slide 12 text

デモ (動画) https://youtu.be/ZRnOHKCWpdM

Slide 13

Slide 13 text

Scalaプロジェクトに AWS CDK を組み込む

Slide 14

Slide 14 text

デモプロジェクト(sbt)の例から解説 シンプルなWebアプリの実装 sbt-native-packager でDockerイメージ化 できるようにしておく

Slide 15

Slide 15 text

CDK用のサブプロジェクトを定義 CDKアプリケーションの実装 ここで実際のインフラリソースの 定義を行う

Slide 16

Slide 16 text

CDKアプリケーションのエントリポイント Stack (デプロイの単位) を複数定義できる 本番環境用Stack、 ステージング用Stack ... etc. CDK アプリケーションを実装する Stackではリソースの定義を行う (後述)

Slide 17

Slide 17 text

CDK アプリケーションを実装する ● VPC ● Subnet ● Route Table ● Internet Gateway ● Application Load Balancer ● Security Group ● ECR Repository ● ECS Cluster ● ECS Service ● ECS Task Definition ● etc... ところで、 Fargate で Web アプリケーションを動かすのに必要なリソースは … Q: これらのリソースを定義するのにどれだけのコード量が必要 ?

Slide 18

Slide 18 text

A: import を含め約50行ほど CDK アプリケーションを実装する

Slide 19

Slide 19 text

AWS CDK では Construct Library という APIを使ってリソースを定義していく。 この Vpc は CloudFormation のリソース定義を抽象 化した High Level Construct と呼ばれる。 VPC そのものの作成以外にも、 複数の Availability Zone に対して Public Subnet や Private Subnet の作成も行ってくれる。 ECS Cluster の定義 リソース定義に必要な設定などは Props として引数に 渡す。 CDK アプリケーションを実装する

Slide 20

Slide 20 text

Fargate の定義 ApplicationLoadBalancedFargateService は Patterns と呼ばれる、一般的なインフラの パターンが定義された API。 ここでは ALB, Service, TaskDefinition など、 冗長化構成となるようなリソースを 一括で定義することが可能。 CDK アプリケーションを実装する

Slide 21

Slide 21 text

Fargate で動作させるコンテナの設定 Assets と呼ばれるローカルのファイルなどのリ ソースをデプロイに含めることのできる機能。 ここでは Dockerfile のあるディレクトリを指定し ている。 これによりデプロイ時に、 コンテナのビルド、ECRへコンテナのプッシュな どをCDK側でよしなに行ってくれる sbt-native-packager で生成されたDockerfile を指定している CDK アプリケーションを実装する

Slide 22

Slide 22 text

GitLab CI による Continuous Deployment の実現

Slide 23

Slide 23 text

GitLab CI による Continuous Deployment の実現 GitLab CI でデプロイを自動化したい おおまかな手順 ● アプリケーションのビルド ● インフラの差分を確認 ● インフラおよびアプリのデプロイ

Slide 24

Slide 24 text

アプリケーションのビルド sbt-native-packager の機能を使う DockerコンテナのビルドはCDK側で行うため Dockerfile までを出力する docker:stage コマンドを使う 生成した Dockerfile を後続のジョブで使えるよう artifacts として保存しておく

Slide 25

Slide 25 text

インフラの差分を確認 npm install でCDKのCLIをインストール (package.json にCLIの依存を含めている ) cdk diff コマンドで現在デプロイされている 状態との差分を確認する

Slide 26

Slide 26 text

インフラの差分を確認 ・CDK アプリケーション(Java) ・CDK CLI (Node.js) ・Docker が動作するコンテナを CI上で別途作成している CI で CDK を実行させるためのコンテナを CI で用意

Slide 27

Slide 27 text

インフラの差分を確認

Slide 28

Slide 28 text

インフラおよびアプリのデプロイ Dockerイメージのビルドを行うので Dockerデーモンにアクセスできるよう設定 cdk deploy コマンドで インフラとアプリをデプロイする

Slide 29

Slide 29 text

デプロイパイプラインを構築できた

Slide 30

Slide 30 text

まとめ 長所・良かったところ ● AWS CDK は既存のプログラミング言語を用いた Infrastructure as Code ○ Java に対応している、すなわち Scala でも使える ! ● 抽象化されたモデルにより、少ないコードで必要なインフラリソースを定義できる ○ 約 50 行ほどのコードで AWS Fargate を使った Web アプリのインフラを作れた ● 静的型付けなのでリソース定義に必要なプロパティがわかりやすい ○ リソース間の依存関係が型で表現されており、 普段の Scala プログラミングの感覚でインフラ定義が書けるため理解がはかどった

Slide 31

Slide 31 text

まとめ 短所・悪かったところ ● ビルダーパターンを使ったインフラ定義が少し冗長 ○ ラッパーライブラリや jsii の Scala 対応が来れば状況は変わる …? ● Java 版は新機能やユーザ製の Constructs ライブラリの提供が遅い ○ プライマリの言語は TypeScript なため ● 環境構築が少し面倒 ( 特に CI 環境 で ) ○ CDK をフルで動かすには JVM, Node, Docker が動く環境が必要 ■ いい方法あったら教えてください …