在 Amazon EC2 上部署 Web 應用程式

入門指南

單元 1:建立基礎設施

在本單元中,您將建立一個 AWS CDK 堆疊、一個具有入站存取權限的安全群組和一個 IAM 執行個體描述檔。

簡介

在部署 Web 應用程式之前,我們需要建立一個 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 執行個體:您將用於託管 Web 應用程式的虛擬機器。
  • 安全群組:允許對您的 Web 應用程式發出入站請求的虛擬防火牆。
  • 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

這些模組提供對部署 Web 應用程式所需的所有元件的存取。第一步是透過在列 (// 定義堆疊的程式碼位於此處) 下方新增以下程式碼來查找您帳戶中現有的預設 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 Machine Image (AMI) 建立 EC2 執行個體 - 在本指南中,您將使用 Amazon Linux 2 for X86_64 CPU 架構。您還將傳遞建立的 IAM 角色、預設的 VPC 和要在其上運行的執行個體類型,在此情況下為 t2.micro,其具有 1 個 vCPU 和 1GB 記憶體 - 您可以在此處檢視所有不同的可用執行個體類型。

// 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,
    });

您現在已經定義 AWS CDK 堆疊以建立 Amazon EC2 執行個體、具有入站存取權限的安全群組和 IAM 執行個體描述檔。在部署堆疊之前,您仍然需要在主機作業系統上安裝套件以運行您的應用程式,並將應用程式碼複製到執行個體。 

您的 ec2-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,
    });
  }
}

結論

在本單元中,您學習了如何建立 CDK 應用程式來建立在 EC2 執行個體上部署 Web 應用程式所需的所有基礎設施。在下一個單元中,您將學習如何在 EC2 執行個體啟動時透過安裝所有作業系統套件、設定它們並將您的程式碼部署到執行個體上來設定這些執行個體。

下一步:自動組態

讓我們知道我們做的如何。