はじめに
今回は、AWS CDK(AWS Cloud Development Kit)で記述したコードを使って、EC2を使った簡単なWebサーバーを公開するまでの手順をまとめてみました。
AWS CDKの基礎知識に関しては、こちらの記事をご参照ください。
今回のゴール
以下の構成を、AWS CDKで構築できるようにします。
同様の構成を、AWS CloudFormationを使用して実装してみた、こちらの記事もぜひご参照ください。
さっそく実装してみた
※今回は単一スタックとして実装しています。
以下のコマンドを順に実行し、CDKプロジェクトのセットアップを行います。
mkdir app
cd app
cdk init --language typescript
app/lib/app-stack.tsの内容を、以下で書き換えます。
import * as cdk from 'aws-cdk-lib';// 'aws-cdk-lib/core'は非推奨です
import { Stack, StackProps } from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import { Construct } from 'constructs';
export class AppStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
// =========================
// VPC
// =========================
const vpc = new ec2.Vpc(this, 'Vpc', {
ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'),
maxAzs: 1,
subnetConfiguration: [
{
name: 'public-subnet',
subnetType: ec2.SubnetType.PUBLIC,
cidrMask: 24,
},
],
natGateways: 0,
});
// =========================
// Security Group
// =========================
const sg = new ec2.SecurityGroup(this, 'PublicSG', {
vpc,
description: 'Allow HTTP access',
allowAllOutbound: true,// デフォルト値だが明示的に
});
sg.addIngressRule(
ec2.Peer.anyIpv4(),
ec2.Port.tcp(80),
'Allow HTTP from anywhere'
);
// =========================
// EC2 Instance
// =========================
const instance = new ec2.Instance(this, 'EC2', {
vpc,
vpcSubnets: {
subnetType: ec2.SubnetType.PUBLIC,
},
instanceType: ec2.InstanceType.of(
ec2.InstanceClass.T3,
ec2.InstanceSize.MICRO
),
machineImage: ec2.MachineImage.latestAmazonLinux2023(),
securityGroup: sg,
});
// =========================
// UserData
// =========================
instance.addUserData(
'#!/bin/bash',
'dnf update -y',
'dnf install -y httpd',
'systemctl start httpd',
'systemctl enable httpd',
'echo "<h1>Hello from EC2!!!!!</h1>" > /var/www/html/index.html'
);
// =========================
// Tag
// =========================
cdk.Tags.of(instance).add('Name', 'test-ec2');
}
}
デプロイ
(必要であれば)以下のコマンドを実行し、CDKのコードからCloudFormationテンプレートを作成します(cdk.out/ フォルダに出力されます)
cdk synth (--profile <profile-name>)
(まだの場合は)CDKのデプロイには、「各AWSアカウントxリージョン」ごとに、ブートストラップスタックを事前に作成する必要があるため、以下のコマンドを実行します。
cdk bootstrap (--profile <profile-name>)
以下のコマンドを実行し、デプロイを完了します。
cdk deploy (--profile <profile-name>)
更新
更新する際は、再度deployコマンドを実行しますが、diffコマンドで差分を確認しておくことが推奨されます。
cdk diff (--profile <profile-name>)
更新によってリソースが一度削除される場合は注意が必要です。
※diffコマンドで検知できるのはあくまでCDK上での差分であり、実際のAWS環境上のリソースとの差分を確認したい場合は、CloudFormationのドリフト機能を使用する必要があります。
削除
スタック(リソース)を削除する場合は、以下のコマンドを実行します。
cdk destroy (--profile <profile-name>)
※DynamoDBなど、デフォルト設定がRemovalPolicy.RETAINになっている場合、削除されずに残ってしまうため、確認が必要です。
※S3バケットは削除時に中身が空になっていないと失敗してしまいます。
(必要なければ)ブートストラップスタック(=CDKToolkit)も削除します。
cdk destroyコマンドでの削除対象は、cdk synthコマンドで生成されるスタックのみのため、CDKToolkitは対象外です。
aws cloudformation delete-stackコマンドを使用します。
aws cloudformation delete-stack \
--stack-name CDKToolkit \
(--profile <profile-name>)
CDKToolkitのS3は内部的にDeletionPolicy: Retainが設定されているため、最後にブートストラップで作成されたs3バケットの中身を空にした後、削除する必要があります。
