0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS CDK】でWebサイトを構築してみた

0
Posted at

はじめに

今回は、AWS CDK(AWS Cloud Development Kit)で記述したコードを使って、EC2を使った簡単なWebサーバーを公開するまでの手順をまとめてみました。

AWS CDKの基礎知識に関しては、こちらの記事をご参照ください。

今回のゴール

以下の構成を、AWS CDKで構築できるようにします。

test.png

同様の構成を、AWS CloudFormationを使用して実装してみた、こちらの記事もぜひご参照ください。

さっそく実装してみた

※今回は単一スタックとして実装しています。

以下のコマンドを順に実行し、CDKプロジェクトのセットアップを行います。

mkdir app

cd app

cdk init --language typescript

app/lib/app-stack.tsの内容を、以下で書き換えます。

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/ フォルダに出力されます)

zsh
cdk synth (--profile <profile-name>)

(まだの場合は)CDKのデプロイには、「各AWSアカウントxリージョン」ごとに、ブートストラップスタックを事前に作成する必要があるため、以下のコマンドを実行します。

zsh
cdk bootstrap (--profile <profile-name>)

以下のコマンドを実行し、デプロイを完了します。

zsh
cdk deploy (--profile <profile-name>)

更新

更新する際は、再度deployコマンドを実行しますが、diffコマンドで差分を確認しておくことが推奨されます。

zsh
cdk diff (--profile <profile-name>)

更新によってリソースが一度削除される場合は注意が必要です。

diffコマンドで検知できるのはあくまでCDK上での差分であり、実際のAWS環境上のリソースとの差分を確認したい場合は、CloudFormationのドリフト機能を使用する必要があります。

削除

スタック(リソース)を削除する場合は、以下のコマンドを実行します。

zsh
cdk destroy (--profile <profile-name>)

※DynamoDBなど、デフォルト設定がRemovalPolicy.RETAINになっている場合、削除されずに残ってしまうため、確認が必要です。
※S3バケットは削除時に中身が空になっていないと失敗してしまいます。

(必要なければ)ブートストラップスタック(=CDKToolkit)も削除します。

cdk destroyコマンドでの削除対象は、cdk synthコマンドで生成されるスタックのみのため、CDKToolkitは対象外です。

aws cloudformation delete-stackコマンドを使用します。

zsh
aws cloudformation delete-stack \
  --stack-name CDKToolkit \
  (--profile <profile-name>)

CDKToolkitのS3は内部的にDeletionPolicy: Retainが設定されているため、最後にブートストラップで作成されたs3バケットの中身を空にした後、削除する必要があります。

0
1
0

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
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?