CDK実装環境整備のススメ~CDKにはCloud9一択になる理由~

Agaroot IT Partners(AITP)のtomoです。

主にAmazon Web Services(以下よりAWS)に関する記事を書いていこうかとおもいます。

まずは手始めとして、AWS CDK(以下よりCDK)を初めて試す際どのように実装環境を整備すべきか、私見を記載できればとおもいます。 なお、ここで述べる実装環境とは、CDKのコードを記述していき、デプロイ実行を行う端末やサーバのことを指します。 環境整備を誤るとセキュリティ上のリスクに直面することもあります。そういったリスクを多少なりとも減らせるよう本記事が参考になれば幸いです。

この記事はこのような方におすすめ

  • CDKを学習してみたい方
  • CDKを業務でも導入してみたい方
  • CDKを低リスクで触れてみたい方

CDK以外のAWSの基本サービス(EC2やIAMなど)は一通り学習や実務を通じて概略を理解されている方を想定しております。そこまで難しい話をするつもりはございません(そして私の実力不足によりできません)が、微細なところまで説明を行うこともできないので、ご容赦ください。

要約

  • 端末からデプロイを行うのは非推奨
  • セキュリティなどの観点から、Cloud9を用いることをお勧め

本題に入る前に…

CDKとは

CDKとは、TypeScriptやPythonなどのプログラミング言語で記述したソースコードを用いてAWS上にインフラリソース構築ができる機能です。
いわゆるInfrastructure as Code(IaC)と呼ばれる技術の1つで、ソースコードでインフラリソースを構築することによりインフラ構成の可視化を行ったり、Gitなどを使うことで変更管理をより簡単にしたりできます。

CDKはAWS CloudFormation(以下よりCloudFormation)のテンプレートを出力し、それをデプロイすることでインフラリソース構築を実現します。もちろんテンプレートを自ら書くことでも同じことが実現できますが、CDKはテンプレートに比べて、以下のメリットを有しています。

  • 慣れ親しんだ言語で記述できる
    おそらくテンプレートで用いられるYAMLやJSONよりも、TypeScriptやPythonなどの方がより慣れ親しんでいることでしょう。CDKでは、そういった慣れ親しんだ言語でIaCを実現できます。
  • 抽象度がより高い
    CloudFormationのテンプレートを記述していくと、多くの項目を記述していくことになります。その中には必須項目も含まれるので、構築しようとしているリソース群の規模によってはなかなか骨の折れる作業になるでしょう。
    それに比べてCDKは抽象度がより高く、S3バケットやEC2インスタンスなどのリソースを多くの場合数行のコードで記述することができます。
    もちろん、抽象度が高いということは、本当はやってほしくない設定が勝手に行われてしまうという事態にも繋がりかねないのですが、その点はドキュメントを参照したり、構築したリソースが想定通りのものになっているかどうか確認したりして、リスク回避やリスク軽減を行いましょう。

CDKを用いてデプロイするまでの流れ

そもそもCDKを用いてインフラをデプロイするまでの、おおまかな流れを見ていきたいとおもいます。もしかしたら既知の内容かもしれませんが、その場合には本段落は読み飛ばしていただくか、復習だと思ってさらっと読んでいただければとおもいます。

なお後述しますが、CDKの実装を行う環境によっては、各手順が不要でスキップすることも可能です。

  • CDKコマンドのインストール
    CDKを用いるには、(一部例外を除いて)開発環境にCDKコマンドをインストールする必要があります。
# 事前にNode.jsをインストールする必要があります。
# https://nodejs.org/ja/download
$ npm install -g aws-cdk
# CDKを開発する言語(TypeScriptやPython)も使えるよう、各種インストールなどを行なってください。
  • CDKプロジェクトの作成
    CDKプロジェクト(簡単にいえばCDKを開発していく専用フォルダ)を作成します。以下にコマンド例を記載します。
$ mkdir cdk-test # ディレクトリ名がプロジェクト名になるので、適宜変更してください。
$ cd cdk-test
$ cdk init app --language typescript
# --languageオプションで指定した言語でプロジェクトのテンプレートが生成されます。
  • コーディング
    インフラ構成をコードで記載していきます。
  • デプロイ
    CDKプロジェクトのトップフォルダ上で以下コマンドを実行することにより、CDKによるデプロイが可能です。
$ cdk deploy

実装環境の各選択肢の概要/メリット/デメリット

ここからが本題です。

CDKの実装環境として、まずはおそらくローカル端末やリモートデスクトップなど、普段からお使いのPCでエディタやIDEを利用するケースを思い浮かべるでしょう。

以下よりローカル端末やリモートデスクトップを利用する場合や、私がお勧めしたいCloud9を利用する場合の、それぞれの概要やメリット/デメリットを紹介していきます。

ローカル端末やリモートデスクトップ

概要

普段お使いのPCで実装を行う方法です。実装を行うPCは手元にあるローカル端末でも、ネット経由で操作を行うリモートデスクトップ(Amazon WorkSpacesなど)でも構いません。

基本的な実装方法は「本題に入る前に…CDKを用いてデプロイするまでの流れ」の通りですが、デプロイを行う際の権限、IAMを事前に設定する必要があります。より具体的には実装用のIAMユーザーを作成し、そのユーザーのアクセスキーをローカル端末やリモートデスクトップで用います。

メリット

  • 端末の強力なCPUやメモリを活用することができる
    大抵の場合EC2インスタンスなどよりも普段お使いのPCの方が、CPUやメモリのスペックが高いかとおもいます。特にメモリの方は後述する他の選択肢だと不足することも多くなります。メモリ不足を心配せずに開発を快適に進められるのは大きなメリットでしょう。
  • 使用するAWSサービスを最低限に限定できる
    EC2インスタンスの起動などは不要なので、使用するAWSサービスを最低限に限定できます。使用料金の軽減につながるでしょう。

デメリット

  • アクセスキー流出のリスク
    IAMユーザーのアクセスキーを用いる以上、流出のリスクがどうしても無視できません。万が一流出した場合、IAMユーザーの権限によっては個人情報などの流出やリソースへのマルウェアの混入、そして何よりマイニングを目的としたEC2インスタンスやLambda関数などの過剰実行などの被害に遭う可能性があります。
    普段開発業務で用いているIAMユーザーは、比較的多くの許可を持っていることも多いでしょう。AdministratorAccessを付与している場合も少なくないかとおもいます。

メリットに対して、このデメリットはあまりに大きいように思えます。このことから、私はローカル端末やリモートデスクトップを開発環境に選ぶのはおすすめしません。

AWS Cloud9

概要

AWS Cloud9(以下よりCloud9)はAWSが提供するブラウザ上で操作が行える統合開発環境(IDE)です。EC2インスタンス上で起動され、Cloud9自体の料金はかかりません。

Cloud9上ではターミナルの実行も可能で、CDKコマンドをはじめとしてCDKの実装に必要なコマンドやライブラリなどが一通り用意されています。
また、デフォルトでマネジメントコンソールにログインした際のIAMユーザーと同じ権限で、AWS CLIやCDKコマンドなどを実行できます。つまりアクセスキーを用いる必要がありません。

ファイルやフォルダのアップロード、ダウンロードも容易に行えるので、コーディングはローカル端末上でVS Codeなど使い慣れたエディタ/IDEで行い、デプロイだけCloud9で行う、といったことも可能です。

Cloud9の起動方法や基本操作については別記事で紹介しますので、よければそちらもご参照ください。

メリット

  • アクセスキーを必要としない
    上述の通り自らのIAMユーザーの権限でデプロイが行えるため、IAMユーザーのアクセスキーを作成する必要がなく、セキュリティー上のリスクが軽減できます。
  • 開発に必要なものがオールインワンで揃っている
    コマンドや言語など開発に必要なものが大方既にインストール済みなので、Cloud9を起動すればそのまますぐに実装に取り掛かれます。
    環境整備の時間コストや労力が大幅に削減できるでしょう。

デメリット

  • 料金が必要になる場合がある
    EC2インスタンスを起動する必要があるので、無料利用枠を超えると料金が発生してしまいます。Cloud9で使うEC2インスタンス以外にもEC2インスタンスが起動している場合や、EC2インスタンスにアタッチするEBSのボリュームサイズを大きくする必要がある場合などは、料金が必要以上に発生しないよう、気をつける必要があります。
  • 他エディタ/IDEとの差異が何となく気になる
    Cloud9を利用していると、時々「何でこんな動きになるの?」と言ったことがあります。例えば、以前私がCloud9でYAMLファイルを編集していた際、シーケンスの要素を追加していく時に改行を押しても「 - 」が自動入力されず、「VSCodeだと自動入力されたはずなのになあ」と感じました。
    おそらく、VSCodeやJetBrains製品、Atomなど既存のエディタ/IDEに慣れた方が多いかと思いますので、そういった小さな差異が何となく気になることもあるかと思います。
    とはいえ、Cloud9もエディタ/IDEとして申し分のない機能を有していますし、もしも普段お使いのPC上のエディタ/IDEで開発を行いたい場合には、ファイルの編集はそちらで行い、Cloud9にファイルをアップロードする、と言った方法で対応できます。なので、そこまで大きなデメリットにはならないかと思います。

以上のことからCDKプロジェクトをコーディングしたりデプロイする場合には、ローカル端末やリモートデスクトップでなくCloud9を使用されることをおすすめします。

まとめ

いかがだったでしょうか。
CDKを実装されてみる場合には、Cloud9のご利用をぜひご検討ください。
そしてくれぐれもローカル端末やリモートデスクトップで、IAMユーザーのアクセスキーを作成して実装することはやめた方がいいかと思います💦

ちなみに、私は下記Udemy講座を通してCDK学習を行ったのですが、私が学んだ時点ではAdministratorAccess権限を持ったIAMユーザーのアクセスキーを作成して、自分の端末で実装するよう指示されていました。
https://www.udemy.com/share/104Sy6/
他の点は大変勉強になりとてもおすすめなのですが、実装環境だけは指示に従わず、Cloud9をご使用されることをおすすめします⚠️

関連するタグ