search
LoginSignup
1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

ぷりぷりあぷりけーしょんず Advent Calendar 2020 Day 2

posted at

updated at

Organization

Terraformしか使ったことなかったけどCDK使ってみた

この記事はぷりぷりあぷりけーしょんず Advent Calendar 2020の2日目の記事です。

概要

これまでAWSの構成管理はTerraformしか利用してこなかったのですが、最近CDKを初めて利用してLambdaの管理を行いました。

CDKは以前から知っていましたが、TypeScriptでの記事が多くPythonで書く気が起きなかったのですが、使ってみたら本当に簡単だったのでざっくりと紹介したいと思います(何番煎じ)。

使い方

プロジェクトの作成

大先輩の記事の3行目のlanguageをPythonにします。

ライブラリの管理

上記の手順でプロジェクトを作成するとvenvがよしなに作られsetup.pyに必要なライブラリを追加してpip install -e .を行うことになります。

このライブラリの管理ですが、以前からpoetryが気になっていたので、今回はpoetryを利用します。

※ poetryを利用する理由はただただ使ってみたかっただけです。

poetryのインストール

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python3

pyenvのインストール

Lambdaのランタイムと開発機のPythonのバージョンを合わせたいのでpyenvを利用します。

brew install pyenv
cat << 'EOS' >> ~/.bash_profile
export PYENV_ROOT=/usr/local/var/pyenv
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi
EOS
source ~/.bash_profile

Python3.8で開発したいので以下をプロジェクトディレクトリで実行します。

rm -r .venv requirements.txt setup.py source.bat
pyenv install 3.8.6
pyenv local 3.8.6

poetryのセットアップ

poetryの設定を対話式で設定することになりますが、基本enterキーで問題ないです。

poetry init

PyCharmと連携

こちらの記事が非常にわかりやすいです。

私の環境でも$HOME/Library/Caches...を指定することで動作を確認できています。

実装

Lambdaで実行するスクリプトの作成

def lambda_handler(event, context):
    print("Hello.")

上記のようなLambdaで実行したいスクリプトを作成し、プロジェクトの配下に置きます。cdkのサンプル集が非常に参考になります。

たとえば下記のようにlambda_function/hello/lambda_function.pyとします。

├── app.py
├── cdk.json
├── ${プロジェクト名}
│   ├── __init__.py
│   └── ${プロジェクト名}_stack.py
├── lambda_function
│   └── hello
│       └── lambda_function.py
└── pyproject.toml

AWSLambdaリソースの作成

必要なライブラリをインストールします。

poetry add from aws_cdk.aws_lambda

すでに星の数ほど記事がありますが、${プロジェクト名}_stack.pyに下記を追記することでLambdaリソースを作成できます。

from aws_cdk import aws_lambda as lambda_

_ = lambda_.Function(
    self,
    "hello-function",
    code=AssetCode("lambda_function/hello"),
    handler="lambda_function.lambda_handler",
    function_name="hello-function"
)

Terraformを利用していると、archive_fileのような組み込みの関数を利用したり、手元でスクリプトをzipファイル化する作業が必要になりますが、CDKを利用することでこれらの手順が不要になりました(便利)。

余談

pandasを利用したく先ほどのサンプル集を参考にpandasのLambdaLayer(参考)を作成したのですが、Mac上でpandasのzipを作成してもnumpyでエラーが生じます。

わざわざEC2やVagrantを利用してAmazonLinuxの環境を作るのは面倒だと考えていたのですが、調べてみるとLambdaLayerを簡単に作成するためのARNが公開されていました。(https://github.com/keithrozario/Klayers/blob/master/deployments/python3.8/arns/ap-northeast-1.csv)

これを利用することで下記のように簡単にLambdaLayerを利用することができるようになります(めっちゃ便利)。

from aws_cdk import aws_lambda as lambda_

_ = lambda_.Function(
    self,
    "pandas-function",
    code=AssetCode("lambda_function/pandas"),
    handler="lambda_function.lambda_handler",
    function_name="pandas-function",
    layers=lambda_.LayerVersion.from_layer_version_arn(
        self,
        "pandas",
        "arn:aws:lambda:ap-northeast-1:770693421928:layer:Klayers-python38-pandas:21"
    )
)

lambdaで実行するスクリプト内ではimport pandas as pdなどするだけで良いです。

デプロイ

cdk bootstrap
cdk deploy

裏でCloudFormationのStackが動いているみたいです。ここらへんはeksctlなどと同じみたいですね。

Terraformだとバイナリファイル一つでデプロイができてCloudFormationが裏で動くこともなくシンプルになりますが、Lambdaとの親和性はCDKの方が良いため今後はCDKも積極的に利用したいですね!

まとめ

Terraformにしか馴染みがなかったのですが、案外CDKを触ってみたら便利だったので記事にしてみました。

Pythonで書けるため、今回紹介したようにpoetryだったりpipenvなど各々の管理したいようにカスタマイズできることもありがたい点だと思いました。

StepFunctionsの実装もCDKでは簡単行えるためインフラの管理をしないサービスの構築にはうってつけだと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1
Help us understand the problem. What are the problem?