Bereitstellen einer Webanwendung auf Amazon EC2

LEITFADEN „ERSTE SCHRITTE“

Modul 1: Erstellen Ihrer Infrastruktur

In diesem Modul erstellen Sie einen AWS-CDK-Stack, eine Sicherheitsgruppe mit eingehendem Zugriff und ein IAM-Instance-Profil.

Einführung

Bevor wir die Webanwendung bereitstellen, müssen wir eine Amazon-EC2-Instance und unterstützende Ressourcen erstellen. In diesem Modul erstellen wir die neue AWS-CDK-App, installieren die Abhängigkeiten für unsere Ressourcen und definieren schließlich eine Amazon-EC2-Instance, eine Sicherheitsgruppe mit eingehendem Zugriff und ein IAM-Instance-Profil. Mit Hilfe von CDK erstellen wir auch das Schlüsselpaar, das für den Zugriff auf die Instance verwendet wird.

Lerninhalte

  • Erstellen einer neuen AWS-CDK-App
  • Installieren von Abhängigkeiten für die erforderlichen Ressourcen
  • Definieren der Ressourcen in der CDK-App

 Veranschlagte Zeit

10 Minuten

 Voraussetzungen für das Modul

  • AWS-Konto mit Administratorzugriff**
  • Empfohlener Browser: aktuelle Version von Chrome oder Firefox

[**] Innerhalb der letzten 24 Stunden erstellte Konten haben möglicherweise noch keinen Zugriff auf alle für dieses Tutorial erforderlichen Services.

Implementierung

Erstellen der CDK-App

Vergewissern Sie sich zunächst, dass CDK installiert ist. Falls dies nicht der Fall ist, folgen Sie bitte dem Leitfaden Erste Schritte mit AWS CDK:

cdk --verison

Wir werden nun die CDK-Skelettanwendung mit TypeScript als Sprache unserer Wahl erstellen:

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

Es wird Folgendes ausgegeben:

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!

Wenn Sie die folgende Meldung sehen, empfehlen wir Ihnen, Ihre CDK-Version mit dem mitgelieferten Befehl zu aktualisieren und anschließend npm update auszuführen:

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

# npm install -g aws-cdk
# npm update

Erstellen des Codes für den Ressourcen-Stack

Gehen Sie zur Datei /lib/cdk-ecs-infra-stack.ts, in die Sie den Code für den zu erstellenden Ressourcen-Stack schreiben werden.

Ein Ressourcen-Stack ist ein Satz von Cloud-Infrastruktur-Ressourcen (in Ihrem speziellen Fall sind das alle AWS-Ressourcen), die für ein bestimmtes Konto bereitgestellt werden. Das Konto/die Region, in der diese Ressourcen bereitgestellt werden, kann im Stack konfiguriert werden.

In diesem Ressourcen-Stack werden Sie die folgenden Ressourcen erstellen:

  • IAM-Rolle: Diese Rolle wird der EC2-Instance zugewiesen, damit sie andere AWS-Services aufrufen kann.
  • EC2-Instance: die virtuelle Maschine, die Sie zum Hosten Ihrer Webanwendung verwenden werden.
  • Sicherheitsgruppe: die virtuelle Firewall, die eingehende Anfragen an Ihre Webanwendung zulässt.
  • EC2-SSH-Schlüsselpaar: eine Reihe von Anmeldedaten, mit denen Sie per SSH auf die Instance zugreifen können, um Befehle zur Einrichtung auszuführen.

Erstellen der EC2-Instance

Um mit dem Erstellen der EC2-Instance und anderer Ressourcen zu beginnen, müssen Sie zunächst die richtigen Module importieren:

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

Anschließend bearbeiten Sie die Datei lib/cdk-eb-infra-stack.ts, um die Abhängigkeit am Anfang der Datei unterhalb des bestehenden Imports für @aws-cdk/core hinzuzufügen:

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

Diese Module bieten Zugang zu allen Komponenten, die Sie für die Bereitstellung der Webanwendung benötigen. Der erste Schritt besteht darin, die vorhandene Standard-VPC in Ihrem Konto zu finden, indem Sie den folgenden Code unter der Zeile // The code that defines your stack goes here eingeben:

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

Mit dem Paket cdk-ec2-key-pair erstellen Sie ein SSH-Schlüsselpaar und speichern es in 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; 

Sie müssen nun eine Sicherheitsgruppe erstellen, die den SSH- und HTTP-Zugang von überall aus ermöglicht, indem Sie 2 Regeln hinzufügen. Beachten Sie, dass der SSH-Zugang von überall aus für eine kurze Zeit in einer Testumgebung akzeptabel ist, aber für Produktionsumgebungen ist er unsicher. Außerdem erstellen Sie eine IAM-Rolle für die EC2-Instance, damit diese andere AWS-Services aufrufen kann, und fügen die vorgefertigte Richtlinie an, um Konfigurationen aus dem AWS Secrets Manager zu lesen (wo der öffentliche SSH-Schlüssel gespeichert wird):

// 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")
    );

Sie sind nun bereit, die EC2-Instance mit einem vorgefertigten Amazon Machine Image (AMI) zu erstellen – dafür verwenden Sie Amazon Linux 2 für die X86_64-CPU-Architektur. Sie übergeben auch die von Ihnen erstellte IAM-Rolle, die Standard-VPC und den Instance-Typ, auf dem die Ausführung erfolgen soll, in Ihrem Fall ein t2.micro mit 1 vCPU und 1 GB Speicher – alle verfügbaren Instance-Typen können Sie hier einsehen.

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

Sie haben nun Ihren AWS-CDK-Stack definiert, um eine Amazon-EC2-Instance, eine Sicherheitsgruppe mit eingehendem Zugriff und ein IAM-Instance-Profil zu erstellen. Bevor Sie den Stack bereitstellen, müssen Sie noch die Pakete auf dem Host-Betriebssystem installieren, um Ihre Anwendung auszuführen, und außerdem Ihren Anwendungscode in die Instance kopieren. 

Ihre Datei ec2-cdk-stack.ts sollte nun folgendermaßen aussehen:

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

Fazit

In diesem Modul haben Sie gelernt, wie Sie eine CDK-Anwendung erstellen, um die gesamte Infrastruktur zu erstellen, die für die Bereitstellung Ihrer Webanwendung auf einer EC2-Instance erforderlich ist. Im nächsten Modul lernen Sie, wie Sie die EC2-Instance beim Booten konfigurieren, indem Sie alle Betriebssystempakete installieren, sie konfigurieren und Ihren Code auf der Instance bereitstellen.

Nächstes Thema: Automatische Konfiguration

Lassen Sie uns wissen, wie wir abgeschnitten haben.