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