Amazon EC2 でウェブアプリケーションをデプロイする

入門ガイド

モジュール 1: インフラストラクチャの作成

このモジュールでは、AWS CDK スタック、インバウンドアクセスを持つセキュリティグループ、IAM インスタンスプロファイルを作成します。

はじめに

ウェブアプリケーションをデプロイする前に、Amazon EC2 インスタンスとサポートリソースを作成する必要があります。このモジュールでは、新しい AWS CDK アプリケーションを作成し、リソースの依存関係をインストールし、最後に Amazon EC2 インスタンス、インバウンドアクセスを持つセキュリティグループ、IAM インスタンスプロファイルを定義します。CDK の助けを借りて、インスタンスにアクセスするために使用するキーペアも作成します。

学習内容

  • 新しい AWS CDK アプリケーションを作成する
  • 必要なリソースの依存関係をインストールする
  • CDK アプリケーションのリソースを定義する

 所要時間

10 分

 モジュールの前提条件

  • 管理者レベルのアクセス権を持つ AWS アカウント**
  • 推奨ブラウザ: Chrome または Firefox の最新バージョン

[**] 過去 24 時間以内に作成されたアカウントは、このチュートリアルに必要なサービスへのアクセス権限がまだ付与されていない可能性があります。

実装

CDK アプリケーションの作成

まず、CDK がインストールされていることを確認してください。インストールされていない場合、「AWS CDK の入門」ガイドに従ってください。

cdk --verison

TypeScript を選択した言語として使用してスケルトン CDK アプリケーションを作成します。

mkdir ec2-cdk
cd ec2-cdk
cdk init app --language typescript

これにより以下が行われます。

Applying project template app for typescript
# Welcome to your CDK TypeScript project!

This is a blank project for TypeScript development with CDK.

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

## Useful commands

 * `npm run build`   compile typescript to js
 * `npm run watch`   watch for changes and compile
 * `npm run test`    perform the jest unit tests
 * `cdk deploy`      deploy this stack to your default AWS account/region
 * `cdk diff`        compare deployed stack with current state
 * `cdk synth`       emits the synthesized CloudFormation template

Executing npm install...
✅ All done!

以下のメッセージが表示された場合、指定されたコマンドを使用して CDK のバージョンをアップグレードし、その後 [npm update] を実行することをお勧めします。

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

# npm install -g aws-cdk
# npm update

リソーススタックのコードを作成する

/lib/cdk-ecs-infra-stack.ts のファイルへ移動します。ここに、これから作成するリソーススタックのコードを書き込みます。

リソーススタックは、特定のアカウントへプロビジョンされる、クラウドインフラストラクチャリソースのセットです (これらが全て AWS リソースになる特別なケースもあり)。これらのリソースがプロビジョンされるアカウント/リージョンは、スタック内で設定される場合もあります。

このリソーススタックでは、以下のリソースを作成することになります。

  • IAM ロール: このロールは EC2 インスタンスに割り当てられ他の AWS のサービスを呼び出す許可を付与します。
  • EC2 インスタンス: ウェブアプリケーションのホストに使用する仮想マシン。
  • セキュリティグループ: ウェブアプリケーションへのインバウンドリクエストを許可する仮想ファイアウォール。
  • EC2 SSH キーペア: 全てをセットアップするために使用するコマンドを実行するインスタンスへの SSH に使用できる認証情報のセット。

EC2 インスタンスの作成

EC2 インスタンス、その他のリソースを作成するには、まず、正しいモジュールをインポートする必要があります。

npm i @aws-cdk/aws-ec2 @aws-cdk/aws-iam @aws-cdk/aws-s3-assets cdk-ec2-key-pair

その後、lib/cdk-eb-infra-stack.ts ファイルを編集し、このファイルのトップの依存関係を、@aws-cdk/core の既存のインポートの下に追加します。

import * as ec2 from "@aws-cdk/aws-ec2";            // Allows working with EC2 and VPC resources
import * as iam from "@aws-cdk/aws-iam";            // Allows working with IAM resources
import * as s3assets from "@aws-cdk/aws-s3-assets"; // Allows managing files with S3
import * as keypair from "cdk-ec2-key-pair";        // Helper to create EC2 SSH keypairs
import * as path from "path";                       // Helper for working with file paths

これらのモジュールはウェブアプリケーションをデプロイするために必要な全てのコンポーネントへのアクセスを提供します。最初のステップは、// スタックを定義するコードはここに移動 のラインの下の以下のコードを追加することによりアカウント内の既存のデフォルト VPC を検索することです。

// The code that defines your stack goes here
      
      // Look up the default VPC
      const vpc = ec2.Vpc.fromLookup(this, "VPC", {
        isDefault: true
      });

cdk-ec2-key-pair パッケージを使用して、SSH キーペアをAWS Secrets Manager 内で作成し保存します。

 // Create a key pair to be used with this EC2 Instance
    const key = new keypair.KeyPair(this, "KeyPair", {
      name: "cdk-keypair",
      description: "Key Pair created with CDK Deployment",
    });
    key.grantReadOnPublicKey; 

次に、2 つのルールを追加することにより SSH と HTTP 全てのアクセスを許可する、セキュリティグループを作成する必要があります。SSH への全てのアクセスはテスト環境では短時間であれば受け入れ可能ですが、本番稼働用環境では危険です。また、EC2 インスタンスの IAM ロールを作成して他の AWS のサービスの呼び出しを許可し、添付された、事前構築済みポリシーに AWS Secrets Manager (SSH パブリックキーが保存される場所) から設定を読み取る許可を付与します。

// Security group for the EC2 instance
    const securityGroup = new ec2.SecurityGroup(this, "SecurityGroup", {
      vpc,
      description: "Allow SSH (TCP port 22) and HTTP (TCP port 80) in",
      allowAllOutbound: true,
    });

    // Allow SSH access on port tcp/22
    securityGroup.addIngressRule(
      ec2.Peer.anyIpv4(),
      ec2.Port.tcp(22),
      "Allow SSH Access"
    );

    // Allow HTTP access on port tcp/80
    securityGroup.addIngressRule(
      ec2.Peer.anyIpv4(),
      ec2.Port.tcp(80),
      "Allow HTTP Access"
    );

    // IAM role to allow access to other AWS services
    const role = new iam.Role(this, "ec2Role", {
      assumedBy: new iam.ServicePrincipal("ec2.amazonaws.com"),
    });

    // IAM policy attachment to allow access to 
    role.addManagedPolicy(
      iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonSSMManagedInstanceCore")
    );

これで、事前構築済み Amazon マシンイメージ (AMI) を使用して EC2 インスタンスを作成する準備ができました。このガイドでは、X86_64 CPU アーキテクチャ用の Amazon Linux 2 を使用します。また、作成した IAM ロール、デフォルト VPC、実行するインスタンスタイプと、お客様の場合は、1 vCPU、1 GB のメモリを持つ t2.micro も渡し、こちらで入手可能な全ての異なるインスタンスタイプが表示されます。

// Look up the AMI Id for the Amazon Linux 2 Image with CPU Type X86_64
    const ami = new ec2.AmazonLinuxImage({
      generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
      cpuType: ec2.AmazonLinuxCpuType.X86_64,
    });
// Create the EC2 instance using the Security Group, AMI, and KeyPair defined.
    const ec2Instance = new ec2.Instance(this, "Instance", {
      vpc,
      instanceType: ec2.InstanceType.of(
        ec2.InstanceClass.T2,
        ec2.InstanceSize.MICRO
      ),
      machineImage: ami,
      securityGroup: securityGroup,
      keyName: key.keyPairName,
      role: role,
    });

これで Amazon EC2 インスタンスを作成する AWS CDK スタック、インバウンドアクセスを持つセキュリティグループ、IAM インスタンスプロファイルを定義しました。スタックをデプロイする前に、アプリケーションを実行するホスト OS にパッケージをインストールし、アプリケーションコードをインスタンスにコピーする必要があります。 

cluster_stack.pyec2-cdk-stack.ts ファイルは次のようになっているはずです。

import * as cdk from '@aws-cdk/core';
import * as ec2 from "@aws-cdk/aws-ec2"; // Allows working with EC2 and VPC resources
import * as iam from "@aws-cdk/aws-iam"; // Allows working with IAM resources
import * as s3assets from "@aws-cdk/aws-s3-assets"; // Allows managing files with S3
import * as keypair from "cdk-ec2-key-pair"; // Helper to create EC2 SSH keypairs
import * as path from "path"; // Helper for working with file paths

export class Ec2CdkStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
          
    // Look up the default VPC
    const vpc = ec2.Vpc.fromLookup(this, "VPC", {
      isDefault: true
    });

    // Create a key pair to be used with this EC2 Instance
    const key = new keypair.KeyPair(this, "KeyPair", {
      name: "cdk-keypair",
      description: "Key Pair created with CDK Deployment",
    });
    key.grantReadOnPublicKey; 

    // Security group for the EC2 instance
    const securityGroup = new ec2.SecurityGroup(this, "SecurityGroup", {
      vpc,
      description: "Allow SSH (TCP port 22) and HTTP (TCP port 80) in",
      allowAllOutbound: true,
    });

    // Allow SSH access on port tcp/22
    securityGroup.addIngressRule(
      ec2.Peer.anyIpv4(),
      ec2.Port.tcp(22),
      "Allow SSH Access"
    );

    // Allow HTTP access on port tcp/80
    securityGroup.addIngressRule(
      ec2.Peer.anyIpv4(),
      ec2.Port.tcp(80),
      "Allow HTTP Access"
    );

    // IAM role to allow access to other AWS services
    const role = new iam.Role(this, "ec2Role", {
      assumedBy: new iam.ServicePrincipal("ec2.amazonaws.com"),
    });

    // IAM policy attachment to allow access to 
    role.addManagedPolicy(
      iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonSSMManagedInstanceCore")
    );

    // Look up the AMI Id for the Amazon Linux 2 Image with CPU Type X86_64
    const ami = new ec2.AmazonLinuxImage({
      generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
      cpuType: ec2.AmazonLinuxCpuType.X86_64,
    });

    // Create the EC2 instance using the Security Group, AMI, and KeyPair defined.
    const ec2Instance = new ec2.Instance(this, "Instance", {
      vpc,
      instanceType: ec2.InstanceType.of(
        ec2.InstanceClass.T2,
        ec2.InstanceSize.MICRO
      ),
      machineImage: ami,
      securityGroup: securityGroup,
      keyName: key.keyPairName,
      role: role,
    });
  }
}

まとめ

このモジュールでは、EC2 インスタンスでウェブアプリケーションをデプロイするために必要な全てのインフラストラクチャを作成するための CDK アプリケーションの作成方法を説明しました。次のモジュールでは、全ての OS パッケージをインストールし、設定し、インスタンスにコードをデプロイすることにより EC2 インスタンスがブートする際の EC2 インスタンスの設定方法を説明します。

当社のサービスについてご意見をお聞かせください。