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.

Vielen Dank für Ihr Feedback
Wir freuen uns, dass diese Seite Ihnen geholfen hat. Würden Sie uns weitere Details mitteilen, damit wir uns weiter verbessern können?
Schließen
Vielen Dank für Ihr Feedback
Es tut uns leid, dass diese Seite Ihnen nicht weiterhelfen konnte. Würden Sie uns weitere Details mitteilen, damit wir uns weiter verbessern können?
Schließen