Eine Webanwendung auf AWS Elastic Beanstalk bereitstellen

LEITFADEN „ERSTE SCHRITTE“

Modul 2: Erstellen einer Infrastruktur mit AWS CDK

In diesem Modul werden Sie eine CDK-Anwendung erstellen, die die gesamte erforderliche Infrastruktur zum Bereitstellen der NodeJS-Webanwendung mit Elastic Beanstalk erstellt.

Einführung

In diesem Modul werden Sie eine CDK-Anwendung erstellen, die die gesamte erforderliche Infrastruktur zum Bereitstellen der NodeJS-Webanwendung mit AWS Elastic Beanstalk erstellt.

Lerninhalte

  • Erstellen Sie eine einfache CDK-Anwendung
  • Hochladen eines Pakets auf S3 mit S3 Assets
  • Erstellen einer Elastic-Beanstalk-CDK-Anwendung, einer Anwendungsversion und einer Umgebung

 Veranschlagte Zeit

15 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

Stellen Sie sicher, dass Sie die neueste CDK-Version haben.

npm install -g cdk

Erstellen Sie ein neues Verzeichnis und öffnen Sie es.

mkdir cdk-eb-infra
cd cdk-eb-infra

Initialisieren Sie die CDK-Anwendung, die Sie mit der Infrastruktur verwenden werden.

cdk init app --language typescript

Erstellen des Codes für den Ressourcen-Stack

Rufen Sie die Datei /lib/cdk-eb-infra-stack.ts auf, 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, über das diese Ressourcen bereitgestellt werden, ist der Stack, den Sie in den vorausgehenden Schritten konfiguriert haben. In diesem Ressourcen-Stack werden Sie folgende Ressourcen erstellen:

  • S3 Assets: Dies hilft Ihnen, Ihre gezippte Anwendung in S3 hochzuladen, und bietet der CDK-Anwendung eine Möglichkeit, den Objektstandort zu ermitteln.
  • Elastic Beanstalk App: Dies ist eine logische Sammlung von Elastic-Beanstalk-Komponenten, darunter auch Umgebungen, Versionen und Umgebungskonfigurationen.
  • Elastic Beanstalk App Version: Dies bezieht sich auf eine bestimmte, gekennzeichnete Iteration des bereitzustellenden Codes für eine Webanwendung. Eine Anwendungsversion verweist auf ein Objekt des Amazon Simple Storage Service (Amazon S3), das den bereitzustellenden Code enthält, in Ihrem Fall die Zip-Datei, die Sie mit den S3-Assets in S3 hochladen werden. Es kann viele Anwendungsversionen geben, und jede Version einer Anwendung ist einzigartig.
  • Instance-Profil und -Rolle: Es handelt sich um einen Container für eine Rolle von AWS Identity and Access Management (IAM), die Sie verwenden können, um Rolleninformationen an eine Amazon-EC2-Instance zu übergeben, wenn die Instance startet.
  • Elastic-Beanstalk-Umgebung: Es handelt sich um eine Sammlung von AWS-Ressourcen, auf denen eine Anwendungsversion läuft. In jeder Umgebung wird jeweils nur eine Anwendungsversion ausgeführt.

App automatisch auf S3 hochladen

Um Ihre Webanwendung bereitzustellen, müssen Sie sie verpacken und in den Amazon Simple Storage Service (S3) hochladen, damit Elastic Beanstalk diese Anwendung in der Umgebung bereitstellen kann.

Wir werden die Anwendung in Modul 3 dieses Leitfadens verpacken, aber im Moment konzentrieren wir uns auf das Hochladen in S3. Dazu verwenden Sie einen CDK-Konstruktor namens S3Assets. Dieses Modul lädt lokale Dateien und Verzeichnisse auf S3 hoch.

Um dies in unserer CDK-Anwendung zu tun, müssen Sie zunächst das Modul aws-s3-assets installieren.

npm i @aws-cdk/aws-s3-assets

Fügen Sie dann in der Datei lib/cdk-eb-infra-stack.ts die Abhängigkeit an den Anfang der Datei.

import s3assets = require('@aws-cdk/aws-s3-assets');

Fügen Sie innerhalb des Stacks unter der Kommentarzeile „The code that defines your stack goes here" den folgenden Code ein.

 // Construct an S3 asset from the ZIP located from directory up.
const webAppZipArchive = new s3assets.Asset(this, 'WebAppZip', {
      path: `${__dirname}/../app.zip`,
});

Dieser Code verwendet das Modul s3 Assets und nimmt die Zip-Datei der Webanwendung, die sich im Stammverzeichnis der CDK-Anwendung befindet, und lädt sie in S3 hoch. Wenn Sie die Zip-Datei aktualisieren und den Stack bereitstellen, wird die Datei in S3 aktualisiert.

Hinzufügen der Elastic-Beanstalk-CDK-Abhängigkeiten

Lassen Sie uns die Elastic-Beanstalk-Anwendung, die Anwendungsversion und die Umgebung erstellen, damit Sie die Webanwendung, die Sie gerade in S3 hochgeladen haben, mit den S3-Assets bereitstellen können.

Zuerst müssen Sie das Elastic-Beanstalk-Modul für CDK installieren.

npm i @aws-cdk/aws-elasticbeanstalk

Fügen Sie dann die Abhängigkeit an den Anfang der Datei /lib/cdk-eb-infra-stack.ts.

import elasticbeanstalk = require('@aws-cdk/aws-elasticbeanstalk');

Erstellen Sie die Elastic-Beanstalk-Anwendung

Jetzt können Sie die Elastic-Beanstalk-Anwendung erstellen. Wie bereits erwähnt, ist eine Elastic-Beanstalk-Anwendung eine logische Sammlung von Elastic-Beanstalk-Komponenten, die einem Ordner ähnelt.

Fügen Sie diesen Code unter den Code der S3Assets ein. Mit diesem Code wird die Anwendung mit dem Namen MyWebApp in Elastic Beanstalk erstellt.

// Create a ElasticBeanStalk app.
const appName = 'MyWebApp';
const app = new elasticbeanstalk.CfnApplication(this, 'Application', {
    applicationName: appName,
});

Version der Elastic-Beanstalk-Anwendung erstellen

Nun müssen Sie eine Anwendungsversion aus dem zuvor erstellten S3-Asset erstellen. Dieser Teil des Codes verwendet den Namen des S3-Buckets und den Schlüssel des S3-Objekts, den S3 Assets und CDK dieser Methode zur Verfügung stellen, um die App-Version zu erstellen.

// Create an app version from the S3 asset defined earlier
const appVersionProps = new elasticbeanstalk.CfnApplicationVersion(this, 'AppVersion', {
    applicationName: appName,
    sourceBundle: {
        s3Bucket: webAppZipArchive.s3BucketName,
        s3Key: webAppZipArchive.s3ObjectKey,
    },
});

Bevor Sie weitermachen, sollten Sie sicherstellen, dass die Elastic-Beanstalk-Anwendung existiert, bevor Sie die App-Version erstellen, was mit CDK sehr einfach ist.

// Make sure that Elastic Beanstalk app exists before creating an app version
appVersionProps.addDependsOn(app);

Erstellen Sie das Instance-Profil

Um Ihre Elastic-Beanstalk-Umgebung zu erstellen, müssen Sie den Namen eines vorhandenen Instance-Profils angeben.

Ein Instance-Profil ist ein Container für eine Rolle von AWS Identity and Access Management (IAM), den Sie verwenden können, um Rolleninformationen an eine Amazon-EC2-Instance zu übergeben, wenn die Instance startet.

In Ihrem Fall wird die an der Rolle die verwaltete Richtlinie - AWSElasticBeanstalkWebTier - angehängt sein. Diese Richtlinie erlaubt es der Anwendung, Protokolle auf Amazon S3 und Debugging-Informationen auf AWS X-Ray hochzuladen.

Als erstes müssen Sie das IAM-Modul in Ihrer CDK-App installieren.

npm i @aws-cdk/aws-iam

Dann importieren Sie die Abhängigkeit in den CDK Stack, an dem wir gearbeitet haben:

import iam = require('@aws-cdk/aws-iam');

Nach dem Code zur Erstellung der Anwendungsversion können Sie diesen Code hinzufügen:

// Create role and instance profile
const myRole = new iam.Role(this, `${appName}-aws-elasticbeanstalk-ec2-role`, {
    assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
});

const managedPolicy = iam.ManagedPolicy.fromAwsManagedPolicyName('AWSElasticBeanstalkWebTier')
myRole.addManagedPolicy(managedPolicy);

const myProfileName = `${appName}-InstanceProfile`

const instanceProfile = new iam.CfnInstanceProfile(this, myProfileName, {
    instanceProfileName: myProfileName,
    roles: [
        myRole.roleName
    ]
});

Als erstes erstellt der Code eine neue IAM-Rolle (myRole).

Damit die EC2 Instances in Ihrer Umgebung die Rolle übernehmen können, legt das Instance-Profil Amazon EC2 als vertrauenswürdige Entität in der Richtlinie für die Vertrauensbeziehung fest.

Zu dieser Rolle fügen wir dann die verwaltete Richtlinie AWSElasticBeanstalkWebTier hinzu und erstellen dann mit dieser Rolle und dem Profilnamen das Instance-Profil.

Elastic-Beanstalk-Umgebung erstellen

Der letzte Teil, den Sie erstellen müssen, ist die Elastic-Beanstalk-Enviroment-Umgebung. Die Umgebung ist eine Sammlung von AWS-Ressourcen, auf denen eine Anwendungsversion läuft. Für die Umgebung müssen wir einige Angaben zur Infrastruktur machen.

Beginnen wir, die Umgebung zu erstellen. Beim Erstellen der Umgebung müssen Sie ihr einen Namen geben, der in der Elastic-Beanstalk-Konsole angezeigt wird - in diesem Fall nennen wir die Umgebung MyWebAppEnvironment.

Dann müssen Sie den Namen der Anwendung angeben, den Sie zuvor aus der Elastic-Beanstalk-Anwendungsdefinition erhalten haben.

Der Name des Lösungs-Stacks ist der Name der verwalteten Plattform, die Elastic Beanstalk für die Ausführung von Webanwendungen bereitstellt. Dank des richtigen Lösungsnamens wird Elastic Beanstalk die richtigen Ressourcen für Ihre Anwendung bereitstellen, zum Beispiel die Amazon-Elastic-Compute-Cloud (Amazon EC2)-Instances. Je nach Framework und Plattform, die Sie für die Entwicklung Ihrer Webanwendung auswählen, sollten Sie den richtigen Software-Stack wählen. Für diesen speziellen Fall werden Sie diese Zeichenfolge ,64bit Amazon Linux 2 v5.4.4 running Node.js 14' eingeben. Wenn Sie wissen möchten, woher diese Zeichenfolge stammt, finden Sie am Ende dieses Moduls weitere Informationen über die Namen von Lösungs-Stacks.

Mit dem Attribut Optionseinstellungen können Sie die Elastic-Beanstalk-Umgebung nach Ihren Bedürfnissen konfigurieren:

  • IamInstanceProfile: Hier verweisen Sie auf das in den vorherigen Schritten erstellte Instance-Profil.
  • MinSize, MaxSize und InstanceTypes: Dies sind Konfigurationen für Ihre Instances und die Autoscaling-Gruppe, die Elastic Beanstalk für Sie generiert. Dies sind optionale Parameter. Wenn Sie sie nicht angeben, wählt Elastic Beanstalk den Instance-Typ sowie die Mindest- und Höchstgröße der Autoscaling-Gruppe entsprechend der Plattformdefinition aus. Sie definieren sie so, dass Sie innerhalb des kostenlosen AWS-Tiers bleiben können.

Weitere Informationen über Konfigurationsoptionen für Elastic Beanstalk

Um alle diese Konfigurationsoptionen zu definieren, fügen Sie die folgenden Codezeilen hinzu:

// Example of some options which can be configured
const optionSettingProperties: elasticbeanstalk.CfnEnvironment.OptionSettingProperty[] = [
    {
        namespace: 'aws:autoscaling:launchconfiguration',
        optionName: 'IamInstanceProfile',
        value: myProfileName,
    },
    {
        namespace: 'aws:autoscaling:asg',
        optionName: 'MinSize',
        value: '1',
    },
    {
        namespace: 'aws:autoscaling:asg',
        optionName: 'MaxSize',
        value: '1',
    },
    {
        namespace: 'aws:ec2:instances',
        optionName: 'InstanceTypes',
        value: 't2.micro',
    },
];

Schließlich haben wir noch die Versionsbezeichnung. Dies ist ein wichtiges Attribut, da es sich um einen Verweis auf die gerade erstellte Anwendungsversion handeln muss.

Mit all diesen Informationen können Sie nun Ihre Elastic-Beanstalk-Umgebung erstellen.

Fügen Sie diesen Code in Ihre Stack-Definitionsdatei ein.

// Create an Elastic Beanstalk environment to run the application
const elbEnv = new elasticbeanstalk.CfnEnvironment(this, 'Environment', {
    environmentName: 'MyWebAppEnvironment',
    applicationName: app.applicationName || appName,
    solutionStackName: '64bit Amazon Linux 2 v5.4.4 running Node.js 14',
    optionSettings: optionSettingProperties,
    versionLabel: appVersionProps.ref,
});

Häufige Fehler

Verwendung mehrerer Versionen der CDK-Bibliotheken

Ein häufiger Fehler, den mit CDK passieren kann, ist, dass, wenn man eine Bibliothek importiert und sie in der Anwendung benutzt, das Wort "this" hervorgehoben wird und sich ein Kompilierungsproblem ergiebt.

gsg_build_elb_1

Dies kann passieren, weil Sie ein CDK-Modul mit einer anderen Version als die CDK-Kernbibliothek verwenden. CDK wird sehr häufig aktualisiert, was dazu führt, dass dieser Fehler recht häufig auftritt.

Um dies zu beheben, müssen Sie alle cdk-Pakete auf die gleiche Version aktualisieren. Sie können die Version Ihrer CDK-Pakete in der package.json-Datei in Ihrer CDK-Anwendung sehen.

gsg_build_elb_2

Weitere Informationen

Weitere Informationen zum Namen des Elastic-Beanstalk-Lösungs-Stacks

In der Dokumentation können Sie sich über alle unterstützten Plattformen für Elastic Beanstalk informieren. Diese Seite wird laufend aktualisiert, wenn neue Plattformen hinzukommen und ältere Plattformen ausgemustert werden.

Wenn Sie neugierig sind, wie Sie den richtigen Plattformnamen erhalten - z.B. 64bit Amazon Linux 2 v5.4.4 mit Node.js 14. Sie können die AWS CLI benutzen und eine Liste aller unterstützten Plattformen erhalten.

aws elasticbeanstalk list-available-solution-stacks

Dies ergibt eine lange Liste von unterstützten Plattform-Strings, die Sie in Ihrer CDK-Anwendung verwenden können.

Abschluss

In diesem Modul haben Sie gelernt, wie Sie alle notwendigen Ressourcen von Elastic Beanstalk erstellen, um Ihre Anwendung automatisch bereitzustellen. Im nächsten Modul werden Sie lernen, wie Sie diese in der Cloud bereitstellen und wie Sie Ihre App bei Änderungen aktualisieren können.

Nächstes Thema: Anwendung bereitstellen

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