いちはじCDK第1回 空プロジェクト編

はじまり

第1回です。
雑に食い散らかしてきてしまったので・・・CDKについて整理してみよう!ってことで始めます。
仕事で使うって言うのもあるんですけど・・・せっかく色々調べたものが次から次へと消えていく・・・そんな現実に抗うため・・・立ち上がらねば!(´_ゝ`)ならないね!(´_ゝ`)

まずわ!

CDKと言えばワークショップでしょう。まずはこれをヤルベキデス。
(´_ゝ`)・・・だと思いましたよ・・・フフフ
まぁワークショップについては、紹介だけ・・・
ここでは、前提条件を満たしている前提で話を進めたいと思います。
(´_ゝ`)「前提条件満たしてる前提」とか・・・ちょっとあれですナ
前提条件はCDKが動く環境ができてることと、AWSアカウント持っていることですね。
環境とは、以下インストール済みであることです。
・AWS CLI
・Node.js
・IDE※
・AWS CDK Toolkit
・Python
※IDEって言葉は私はピン!と来なかったけど、ソースコード書くためのエディタですね。
 私はVS Codeにしました。結構使いやすいかなと思っていておすすめです。
ワークショップでも前提条件があるので、その部分を参考にしてもらえると良いかなと。
(´_ゝ`)っていうかここに書いてあるのもそこから丸パクリですからねっ!

プロジェクトAを作る

ジャッキーチェン・サモハンキンポー・・・映画の最後にはNGシーン集・・・懐かしいですね・・・
・・・(‘ω’)・・・関係ないこと書くなよ・・・
では、CDKの初期プロジェクトを作りましょう~
言ってなかったけど、Pythonでやります。良く、
(´_ゝ`)「TypeScriptがいいぜ!」
って聞きますけど、仕事で使っているのがPythonなんで・・・
Pythonも使ってみると結構好きになりますね・・・でも自分はC++派ですけど・・・

まずは、プロジェクト用にディレクトリを作りましょう。
これは好きな場所に作ればよく、自分がやりやすいところに作りましょう。
このブログでは以下の構成を例にしてお話を進めます。

e:\cdk-core-project

で作ったディレクトリに移動。「cdk-core-project」の下ですね。
で以下のコマンドを実施です。

cdk init app --language python

そうすると、プロジェクトのひな形を作ってくれます。
今回はイメージ伝わるようにコマンド実行結果を全部張り付けます。

> cdk init app --language python
Applying project template app for python

# Welcome to your CDK Python project!

This is a blank project for CDK development with Python.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

This project is set up like a standard Python project.  The initialization
process also creates a virtualenv within this project, stored under the `.venv`
directory.  To create the virtualenv it assumes that there is a `python3`
(or `python` for Windows) executable in your path with access to the `venv`
package. If for any reason the automatic creation of the virtualenv fails,
you can create the virtualenv manually.

To manually create a virtualenv on MacOS and Linux:

```
$ python -m venv .venv
```

After the init process completes and the virtualenv is created, you can use the following
step to activate your virtualenv.

```
$ source .venv/bin/activate
```

If you are a Windows platform, you would activate the virtualenv like this:

```
% .venv\Scripts\activate.bat
```

Once the virtualenv is activated, you can install the required dependencies.

```
$ pip install -r requirements.txt
```

At this point you can now synthesize the CloudFormation template for this code.

```
$ cdk synth
```

To add additional dependencies, for example other CDK libraries, just add
them to your `setup.py` file and rerun the `pip install -r requirements.txt`
command.

## Useful commands

 * `cdk ls`          list all stacks in the app
 * `cdk synth`       emits the synthesized CloudFormation template
 * `cdk deploy`      deploy this stack to your default AWS account/region
 * `cdk diff`        compare deployed stack with current state
 * `cdk docs`        open CDK documentation

Enjoy!

Initializing a new git repository...
warning: in the working copy of '.gitignore', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'README.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'app.py', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'cdk.json', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'cdk_core_project/cdk_core_project_stack.py', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'requirements-dev.txt', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'requirements.txt', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'source.bat', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'tests/unit/test_cdk_core_project_stack.py', LF will be replaced by CRLF the next time Git touches it
Please run 'python -m venv .venv'!
Executing Creating virtualenv...
✅ All done!
****************************************************
*** Newer version of CDK is available [2.158.0]  ***
*** Upgrade recommended (npm install -g aws-cdk) ***
****************************************************

Windows環境なので、リターンコードCRLFとなることから、LINUX系のリターンコードLF→CRLFに変更した旨のwarningが出ていますが、あまり気にせず・・・
あと最後に、

****************************************************
*** Newer version of CDK is available [2.158.0]  ***
*** Upgrade recommended (npm install -g aws-cdk) ***
****************************************************

これが出てますね。これもCDKのバージョンがもっと新しいのが出てるってことを言っているので、とりあえずは慌ててバージョンアップするとか、そういうのは考えなくて良いようです。
結果として「cdk-core-project」の下に以下のようなディレクトリ構成でプロジェクトの元が作られます。

cdk_core_project/
├ .venv/
│ └…省略…
├ .gitignore
├ cdk_core_project/
│ ├ __init__.py
│ └ cdk_core_project_stack.py
├ tests/
│ └ unit/
│   ├ __init__.py
│   └ test_cdk_core_project_stack.py
├ app.py
├ cdk.json
├ README.md
├ requirements-dev.txt
├ requirements.txt
└ source.bat

ここまでは、特に大きな問題はないのかなと・・・
説明が必要そうなものをメモっておきます。
.venv/
CDKというよりはpythonの仮想環境を提供するパッケージです。
他の環境に影響をあたえることなく、仮想的な開発環境を提供しくれるものです。
仮想環境下でインストールしたものは、ホストのマシンには影響しません。仮想環境を削除したら綺麗に消すことができます。

.gitignore
GITにアップデートする必要がないものを除外するための指定を記載しておくファイルです。
GIT管理するときには、こちらをそのまま使えばGIT管理不要なファイルを除外してpushできます。
自分で利用する際に、更に除外したいものがあれば追記もできます。

cdk_core_project/
このディレクトリの下にstack(後で説明します。)に関するCDKファイルを作成していきます。
CDKさんが、すでに「cdk_core_project_stack.py」というファイルを自動生成している状態です。
このディレクトリ名や、ファイル名はpythonのルールで配置すれば良いものなので、後でも変更可能です。CDKさんはとりあえず、親ディレクトリの名前と同じ名前で作ってくれます。

tests/
私自身ここの理解ができてないので説明は割愛します。テスト用のディレクトリだと思ていますが…テスト?どんな風に使うんでしょ…

app.py
C言語でいうところのmain.cのようなファイル。CDKスタートのファイルとでも覚えていてもらえると良いかと…

cdk.json
…(*´ω`)これも良くわからないので割愛…あまり気にしたことないけどCDKさんが使うみたい。

README.md
CDKさんが作ってくれるREADME。GITに管理で使うことを想定しているものですね。GITにpushしてみるとなんかいい感じに見えます…もちろん自分が好きなように書き換えるのもOKです。

requirements.txt
pythonの仮想環境を作るときに、インストールが必要なパッケージを記載するファイルです。

requirements-dev.txt
こちらは、開発環境のみで必要となるものを記載するファイルです。本番の環境に含める必要ないものはこちらに記載する。まぁ私は何をいれんのかな?って思いましたが、フォーマッター、コードチェッカー(blackとか、flake8とか、pylintとか)、なんかを入れるみたいですね。本サイトだと個人向けコーディングなんで、あまりそういう部分は気にしないつもりですが・・・
( `ー´)ノ話なげーよ

source.bat
windowsの環境でpythonの仮想環境を有効化するときに使うもの見たいですね。Power Shell使う人はこのファイルは使わないと思うし、コマンドプロンプト使って作業する人いるんんかな?

作業を始める前の準備

最初のコマンドだけだと、python周りの環境構築が終わってないです。
ここで登場するのが.venv/に収められているpythonの仮想環境です。
pythonさんの公式ページの説明から

venv モジュールは、軽量な仮想環境の作成を行います。それぞれの仮想環境は、site ディレクトリに独立した Python パッケージの集合を持っています。仮想環境は、ベース Python とも呼ばれる、すでにインストールされている Python の上に作成され、明示的にインストールしたパッケージのみが利用可能となるよう、ベース Python から隔離することもできます。

まぁ、コピーしただけですけど…何言ってんのか良くわからないなぁという印象受けました。
仮想環境の下でインストールとかしたものは、ホスト環境(伝わるかな?この表現)には影響しないようにできるってことなんだと思います。なので、ガンガンインストールしても大丈夫だぜ!(´_ゝ`)って思っておけばいいのかなと…

で、「cdk init app –language python」このコマンド実行しただけだと、python用のCDKライブラリとかまだ入ってないんですね。
なので、これらを仮想環境上でインストールしていくわけです。

まずは仮想環境を有効化します。これ忘れると色々失敗します。私も良く失念してしまうことも…先日は、仮想環境有効化せずにinstallを行ってしまったけど…あれは、ホスト側PCにインストールされてしまったのか・・・(´・ω・;)・・・どうなんだろうね・・・
仮想環境の有効化コマンドは以下ですね…
Windows(Power Shell)

> .venv\Scripts\Activate.ps1

LINUX&Mac

> source .venv/bin/activate

これって、「cdk init app –language python」コマンド打った時にリプライで出力されているんで…上のリプライを見直してもらえたらよいかな・・・
これを実行すると・・・

PS E:\cdk-core-project> .\.venv\Scripts\Activate.ps1
(.venv) PS E:\cdk-core-project> 

こんな感じになって先頭に「(.venv)」が付きます。
あ、私は、VS Codeなんで上記のようなイメージです。LINUXとかでも大体おんなじですけどね。
さて・・・仮想環境を無効にするには・・・

> deactivate

を実施します。先頭の「(.venv)」が消えると思います。
ここでdeactivateしちゃった人はもう一度、仮想環境を有効にしてから続きをして下さいね・・・

続いて、CDKのpythonライブラリとかをinstallしてきます。
ここで登場するのが、「requirements.txt」と「requirements-dev.txt」ファイルです。
ここは、pythonで必要なライブラリファイルを記載する所です。
現状は以下のようなものが記載されていて、CDKさんが自動で作ってくれたものになります。

aws-cdk-lib==2.155.0
constructs>=10.0.0,<11.0.0

今はまだ、内容を細かく気にする必要ないです。
気を付けておくことは、
CDKはバージョンがガンガン上がるので、バージョン指定した方が良いと思います。
CDK以外に利用するパッケージ追加する場合も、CDKのライブラリと相性が悪いケースもあるので、バージョンを指定しておいた方が良いです。常に最新みたいにしていると、突然問題が起こったりします。って辺りですかね・・・
では、pythonの仮想環境を有効にして、開発環境にライブラリをinstallしてきましょう。

> pip install -r requirements.txt

と、

> pip install -r requirements-dev.txt

を実施します。
この時すんなり行くこともあるんですけど・・・まーバージョンが古いとかなんだとか・・・そういったエラーでることもあります。
そんな時は、各パッケージのバージョンとかを確認しながら再度実施して下さい。
なお、「requirements.txt」に新しいパッケージ追加しました!って時は以下のコマンドでアップデートして下さい。

> pip install --upgrade -r requirements.txt

これで準備はOKです。

app.py

始まりのファイルです。CDKさんはこいつから読み始めます。
中身は以下の感じ…長くないんでマンマ貼りますね。

#!/usr/bin/env python3
import os

import aws_cdk as cdk

from cdk_core_project_tmp.cdk_core_project_tmp_stack import CdkCoreProjectTmpStack


app = cdk.App()
CdkCoreProjectTmpStack(app, "CdkCoreProjectTmpStack",
    # If you don't specify 'env', this stack will be environment-agnostic.
    # Account/Region-dependent features and context lookups will not work,
    # but a single synthesized template can be deployed anywhere.

    # Uncomment the next line to specialize this stack for the AWS Account
    # and Region that are implied by the current CLI configuration.

    #env=cdk.Environment(account=os.getenv('CDK_DEFAULT_ACCOUNT'), region=os.getenv('CDK_DEFAULT_REGION')),

    # Uncomment the next line if you know exactly what Account and Region you
    # want to deploy the stack to. */

    #env=cdk.Environment(account='123456789012', region='us-east-1'),

    # For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html
    )

app.synth()

まずは、コメント部分の和訳から

If you don’t specify ‘env’, this stack will be environment-agnostic.
‘env’ を指定しない場合、このスタックは環境に依存しなくなります。

Account/Region-dependent features and context lookups will not work,but a single synthesized template can be deployed anywhere.
アカウント/リージョンに依存する機能とコンテキスト検索は機能しませんが、単一の合成テンプレートはどこにでも展開できます。

Uncomment the next line to specialize this stack for the AWS Account and Region that are implied by the current CLI configuration.
次の行のコメントを解除して、現在の CLI 設定によって暗示される AWS アカウントとリージョンに対してこのスタックを特化します。
#env=cdk.Environment(account=os.getenv(‘CDK_DEFAULT_ACCOUNT’),region=os.getenv(‘CDK_DEFAULT_REGION’)),

Uncomment the next line if you know exactly what Account and Region you want to deploy the stack to.
スタックをデプロイするアカウントとリージョンが正確にわかっている場合は、次の行のコメントを解除します。
#env=cdk.Environment(account=’123456789012′, region=’us-east-1′),

For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html
詳細については、https://docs.aws.amazon.com/cdk/latest/guide/environments.html

と・・・大体の人は、リージョンとか固定して使うと思うので、Environmentは使った方が都合が良いと思いますので、このサイトでは、以下をコメント解除で進めようと思います。
#env=cdk.Environment(account=’123456789012′, region=’us-east-1′),

と言う訳で、以下のようにapp.pyを変更します。
変更部分は赤字で記載してあります。

#!/usr/bin/env python3
import os

from aws_cdk import App,Environment
from cdk_core_project.cdk_core_project_stack import CdkCoreProjectStack

app = App()
env = Environment(account='123456789012', region='ap-northeast-1')
CdkCoreProjectStack(app,"CdkCoreProjectStack",env=env)
app.synth()

ずいぶんすっきりした感じになりました。
importするものを絞りました。あと、evnパラメータの設定を先に実施してから、CdkCoreProjectStackのパラメータに指定するような形に変えてます。
account=’123456789012’はご自分のアカウントIDに変更してください。
これで、何もリソースを作らない空っぽのプロジェクトの出来上がりです。

で・・・ココからsynthしていきます(‘◇’)ゞ

はじめてのsynth

さてコードが完成したので、synthしてきます。
CDKのコーディング作業では、
1.コード作成。
2.cdk synth
3.cdk diff
4.cdk deploy
で実際のリソースをデプロイします。
ここでリソースって言っているのは、EC2であったり、ALBであったりAWSの各サービスのリソースを指しています。

ただ、今回はリソース無しなので・・・できるのはsynthまでになりますね。
なので、synthをしてきます。
app.pyのあるプロジェクトのトップディレクトリで以下のコマンドを実施します。

> cdk synth

結果は以下のようになります。

(.venv) PS E:\cdk-core-project> cdk synth
Resources:
  CDKMetadata:
    Type: AWS::CDK::Metadata
    Properties:
      Analytics: v2:deflate64:H4sIAAAAAAAA/zPSMzQ11TNQTCwv1k1OydbNyUzSqw4uSUzO1nFOywtKLc4vLUpOrdUJqCzJyM/TN9YzNNIzVcwqzszULSrNK8nMTdULgtAA8qfeWUoAAAA=
    Metadata:
      aws:cdk:path: CdkCoreProjectTmpStack/CDKMetadata/Default
Parameters:
  BootstrapVersion:
    Type: AWS::SSM::Parameter::Value<String>
    Default: /cdk-bootstrap/hnb659fds/version
    Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]

これで空プロジェクトを作る編は完了です。
synthするとCloud Foundationのコードに変換されたものが出てきます。
(´・ω・)なんだか読み返すとワークショップと内容同じでは・・・
いらんことは言わんでもいいんです・・・( 一一)
これから、だんだん、特徴がでてくるんじゃないかぁー・・・きっとね・・・
ということで、第1回はおしまいです。
最後に、ここまでのソースをこちらのGitに上げてあります。
(・´з`・)見る人いるんかな・・・
次回は・・・
いちはじCDK第2回 構成を考える編」も気になったら見て下さい。

コメント

タイトルとURLをコピーしました