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

AWS CDK on Scala ~ Scalaでインフラ管理してみたはなし / Manage infrastructure with AWS CDK on Scala

Takumi Kadowaki
September 25, 2020

AWS CDK on Scala ~ Scalaでインフラ管理してみたはなし / Manage infrastructure with AWS CDK on Scala

Takumi Kadowaki

September 25, 2020
Tweet

More Decks by Takumi Kadowaki

Other Decks in Technology

Transcript

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

    View Slide

  2. Takumi Kadowaki
    株式会社セプテーニ・オリジナル所属
    自称
    : Full "stuck" Scala Engineer
    Scala
    でなんでもやりたいひと
    おしごと
    :
    データ基盤の
    SRE

    GitHub: NomadBlacky

    Twitter: @nomadblacky
    Ammonite

    Scala
    スクリプトに入門する本出しました→
    だれ?

    View Slide

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

    AWS CDK
    の簡単な概要

    AWS CDK

    Scala
    プロジェクトで扱う方法

    GitLab CI
    を使った
    Continuous Deployment
    の実現方法
    やってみたレベルの話なので深い話はあまりしません
    今回話すこと

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  9. AWS CDK について

    View Slide

  10. AWS CDK について
    ● 既存のプログラミング言語を使って
    AWS
    のクラウドリソースを定義、
    プロビジョニングするためのツール
    ○ いわゆる
    Infrastructure as Code
    ● 対応言語

    TypeScript, Python, .NET, Java

    Scala
    から使える
    !
    ● 各言語で定義したモデルが
    CloudFormation
    のテンプレートに変換される
    ● アプリケーションを一緒にデプロイする機能
    ○ インフラのプロビジョニング → アプリケーションのデプロイ
    という
    2
    段階の手順を踏む必要がなくなる

    CDK
    のデプロイが完了した時点でアプリケーションが動作する完全な状態になる

    View Slide

  11. デモ: FargateにScalaアプリをデプロイしてみる
    いきなり説明されても実感が湧きにくいので

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  17. 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: これらのリソースを定義するのにどれだけのコード量が必要 ?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  22. GitLab CI による
    Continuous Deployment の実現

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    CDK
    を実行させるためのコンテナを
    CI
    で用意

    View Slide

  27. インフラの差分を確認

    View Slide

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

    View Slide

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

    View Slide

  30. まとめ
    長所・良かったところ

    AWS CDK
    は既存のプログラミング言語を用いた
    Infrastructure as Code

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

    View Slide

  31. まとめ
    短所・悪かったところ
    ● ビルダーパターンを使ったインフラ定義が少し冗長
    ○ ラッパーライブラリや
    jsii

    Scala
    対応が来れば状況は変わる
    …?

    Java
    版は新機能やユーザ製の
    Constructs
    ライブラリの提供が遅い
    ○ プライマリの言語は
    TypeScript
    なため
    ● 環境構築が少し面倒
    (
    特に
    CI
    環境 で
    )

    CDK
    をフルで動かすには
    JVM, Node, Docker
    が動く環境が必要
    ■ いい方法あったら教えてください

    View Slide