AWS CDKの勉強を始めてみた
仕事でAWS CDKを使うので勉強をはじめました。
CCNAの勉強でAnsibleなどのインフラ構築ツールみたいなものの存在は知っており、AWS CDKについてもなんとなく資格勉強の時に「Pythonでインフラ構築できるやつ」という認識だったのでどんなものかは知っておりました。
今回は実際に環境構築してCDKでインフラ構築を行ってみたいと思います。
まずは環境構築ですが、node関係が必要なので下記記事を参考にPCにnodeやnpmを使える環境を構築していきます。
CDKインストール
npm install -g aws-cdk
cdk --version
npmを実行したときに、PATHが設定されていないなど警告される場合
fnm env --use-on-cd | Out-String | Invoke-Expression
を実行します。
上記を毎回実行するのが面倒であれば、
@echo off
fnm env --use-on-cd | Out-String | Invoke-Expression
テキストファイルに上記を記載し、「startup.bat」
として保存しておきます。右クリックでショートカットを作成し、
Win+Rで「shell:startup」と入力して、出てきたフォルダに先ほどのショートカットを放り込みます。
これでPCを立ち上げるたびに上のコマンドを入力する必要がなくなります。
問題なければ構築完了です。
アクセスキー等の取得
AWS CLI の準備とアクセスキーを取得していきます。
上記サイトで解説しているので参考にインストール&設定が完了しました。
IAMでリソースへのアクセスを許可する設定が必要なので対応します。
IAMでポリシーを追加します。
AdministratorAccess または AWSCloudFormationFullAccessを検索して追加します。
再度
cdk bootstrap aws://ACCOUNT-NUMBER/REGION
を実行します。
プロジェクトの作成
下記コマンドでプロジェクトを作成します。
cdk init --language typescript
AWS環境を設定します。
下記コマンドでアカウントの確認を行えます。
aws sts get-caller-identity --query "Account" --output text
下記でリージョンの確認をします。
aws configure get region
上記チュートリアルに従って下記を編集します。
bin/プロジェクト名.ts
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { CdkDemoStack } from '../lib/cdk-demo-stack';
const app = new cdk.App();
new CdkDemoStack(app, 'CdkDemoStack', {
env: { account: 'アカウントナンバー', region: 'リージョン' },
});
CdkDemoStackはプロジェクト名が入ります。
準備が整いました
下記コードでデプロイする準備が完了します。
cdk bootstrap
構文にエラーがないか確かめる。
npm run build
アプリ内のCDKスタックを一覧表示します。
cdk list
CDKスタックについてはこちら
まだ完全に理解していないが、リソースみたいなものと理解している。
チュートリアル通り、まずLambdaを定義します。
lib/cdk-demo-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
// Import the Lambda module
import * as lambda from 'aws-cdk-lib/aws-lambda';
export class CdkDemoStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Define the Lambda function resource
const myFunction = new lambda.Function(this, "HelloWorldFunction", {
runtime: lambda.Runtime.NODEJS_20_X, // Provide any supported Node.js runtime
handler: "index.handler",
code: lambda.Code.fromInline(`
exports.handler = async function(event) {
return {
statusCode: 200,
body: JSON.stringify('Hello World!'),
};
};
`),
});
}
}
下記にどのようにLambda関数をURLで実行するか定義していきます。
lib/cdk-demo-stack.ts
// Define the Lambda function resource の塊の下に下記を記載
// Define the Lambda function URL resource
const myFunctionUrl = myFunction.addFunctionUrl({
authType: lambda.FunctionUrlAuthType.NONE,
});
// Define a CloudFormation output for your URL
new cdk.CfnOutput(this, "myFunctionUrlOutput", {
value: myFunctionUrl.url,
})
CloudFormationテンプレートを合成するコマンドを実行します。
AWS CDKは最終的にCloudFormationを実行することになるので下記コマンドでテンプレートを作成します。
cdk synth
yaml形式のテンプレートが表示されます。
デプロイを行う
下記コードでデプロイ完了です。
cdk deploy
デプロイが完了するとエンドポイントURLが出力されるので控えておきます。
下記コマンドでURLをたたいてみます。
curl [URL]
ステータスコード200,HelloWorldが返されており実行成功です。
スタックを変更してみる
Lambdaを実行して返すメッセージを変更します。
return {
statusCode: 200,
body: JSON.stringify('Hello CDK!'),
};
下記コマンドを実行してCloudFormationテンプレートを作り直します。
cdk diff
デプロイしなおします。
cdk deploy
実行して確かめます。
curl [URL]
認証がないLambdaなのでセキュリティのために削除しておきます。
cdk destroy
はじめてのCDKを終えてみて
意外と複雑でなくて使いやすいかもしれない。
細かい設定やVPCのリソースの立ち上げについてはめんどくさいらしいので、もうすこし勉強してみたいと思いました。