Erstellen von ECS Amazon-Ressourcen mit dem AWS CDK - Amazon Elastic Container Service

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Erstellen von ECS Amazon-Ressourcen mit dem AWS CDK

Das AWS Cloud Development Kit (AWS CDK) ist ein Infrastructure-as-Code (IAC) -Framework, das Sie verwenden können, um die AWS Cloud-Infrastruktur mithilfe einer Programmiersprache Ihrer Wahl zu definieren. Um Ihre eigene Cloud-Infrastruktur zu definieren, schreiben Sie zunächst eine App (in einer CDK der unterstützten Sprachen), die einen oder mehrere Stacks enthält. Anschließend synthetisieren Sie es zu einer AWS CloudFormation Vorlage und stellen Ihre Ressourcen auf Ihrem bereit. AWS-Konto Folgen Sie den Schritten in diesem Thema, um einen containerisierten Webserver mit Amazon Elastic Container Service (AmazonECS) und dem AWS CDK auf Fargate bereitzustellen.

Die AWS Construct-Bibliothek, die im Lieferumfang von enthalten istCDK, stellt Module bereit, mit denen Sie die bereitgestellten Ressourcen modellieren können. AWS-Services Für die gängigen Dienste stellt die Bibliothek kuratierte Konstrukte bereit, die intelligente Standards und bewährte Methoden bereitstellen. Eines dieser Module, insbesondere aws-ecs-patterns, bietet Abstraktionen auf hoher Ebene, mit denen Sie Ihren containerisierten Service und alle notwendigen unterstützenden Ressourcen in nur wenigen Codezeilen definieren können.

In diesem Thema wird das Konstrukt ApplicationLoadBalancedFargateService verwendet. Dieses Konstrukt stellt einen ECS Amazon-Service auf Fargate hinter einem Application Load Balancer bereit. Das aws-ecs-patterns Modul enthält auch Konstrukte, die einen Network Load Balancer verwenden und auf Amazon laufen. EC2

Bevor Sie mit dieser Aufgabe beginnen, richten Sie Ihre AWS CDK Entwicklungsumgebung ein und installieren Sie sie, AWS CDK indem Sie den folgenden Befehl ausführen. Anweisungen zum Einrichten Ihrer AWS CDK Entwicklungsumgebung finden Sie unter Erste Schritte mit den AWS CDK — Voraussetzungen.

npm install -g aws-cdk
Anmerkung

Bei diesen Anweisungen wird davon ausgegangen, dass Sie AWS CDK Version 2 verwenden.

Schritt 1: Richten Sie Ihr AWS CDK Projekt ein

Erstellen Sie ein Verzeichnis für Ihre neue AWS CDK App und initialisieren Sie das Projekt.

TypeScript
mkdir hello-ecs cd hello-ecs cdk init --language typescript
JavaScript
mkdir hello-ecs cd hello-ecs cdk init --language javascript
Python
mkdir hello-ecs cd hello-ecs cdk init --language python

Nachdem das Projekt gestartet wurde, aktivieren Sie die virtuelle Umgebung des Projekts und installieren Sie die AWS CDK Basisabhängigkeiten.

source .venv/bin/activate python -m pip install -r requirements.txt
Java
mkdir hello-ecs cd hello-ecs cdk init --language java

Importieren Sie dieses Maven-Projekt in Ihr JavaIDE. Verwenden Sie in Eclipse beispielsweise Datei >Import >Maven >Vorhandene Maven-Projekte.

C#
mkdir hello-ecs cd hello-ecs cdk init --language csharp
Go
mkdir hello-ecs cd hello-ecs cdk init --language go
Anmerkung

Die AWS CDK Anwendungsvorlage verwendet den Namen des Projektverzeichnisses, um Namen für Quelldateien und Klassen zu generieren. In diesem Beispiel trägt das Verzeichnis den Namen hello-ecs. Wenn Sie einen anderen Projektverzeichnisnamen verwenden, stimmt Ihre App nicht mit diesen Anweisungen überein.

AWS CDK v2 enthält stabile Konstrukte für alle AWS-Services in einem einzigen Paket, das aufgerufen wirdaws-cdk-lib. Dieses Paket wird als Abhängigkeit installiert, wenn Sie das Projekt initialisieren. Wenn Sie mit bestimmten Programmiersprachen arbeiten, wird das Paket installiert, wenn Sie das Projekt zum ersten Mal erstellen. In diesem Thema wird beschrieben, wie Sie ein Amazon ECS Patterns-Konstrukt verwenden, das Abstraktionen auf hoher Ebene für die Arbeit mit Amazon ECS bereitstellt. Dieses Modul stützt sich auf ECS Amazon-Konstrukte und andere Konstrukte, um die Ressourcen bereitzustellen, die Ihre ECS Amazon-Anwendung benötigt.

Die Namen, die Sie verwenden, um diese Bibliotheken in Ihre CDK Anwendung zu importieren, können sich je nach verwendeter Programmiersprache geringfügig unterscheiden. Als Referenz werden im Folgenden die Namen aufgeführt, die in jeder unterstützten CDK Programmiersprache verwendet werden.

TypeScript
aws-cdk-lib/aws-ecs aws-cdk-lib/aws-ecs-patterns
JavaScript
aws-cdk-lib/aws-ecs aws-cdk-lib/aws-ecs-patterns
Python
aws_cdk.aws_ecs aws_cdk.aws_ecs_patterns
Java
software.amazon.awscdk.services.ecs software.amazon.awscdk.services.ecs.patterns
C#
Amazon.CDK.AWS.ECS Amazon.CDK.AWS.ECS.Patterns
Go
github.com/aws/aws-cdk-go/awscdk/v2/awsecs github.com/aws/aws-cdk-go/awscdk/v2/awsecspatterns

Schritt 2: Verwenden Sie den AWS CDK , um einen containerisierten Webserver auf Fargate zu definieren

Verwenden Sie das Container-Image von. amazon-ecs-sample DockerHub Dieses Bild enthält eine PHP Web-App, die auf Amazon Linux 2 läuft.

Bearbeiten Sie in dem von Ihnen erstellten AWS CDK Projekt die Datei, die die Stack-Definition enthält, so, dass sie einem der folgenden Beispiele ähnelt.

Anmerkung

Ein Stack ist eine Einheit der Bereitstellung. Alle Ressourcen müssen sich in einem Stack befinden, und alle Ressourcen, die sich in einem Stack befinden, werden gleichzeitig bereitgestellt. Wenn eine Ressource nicht bereitgestellt werden kann, werden alle anderen, die bereits bereitgestellt wurden, zurückgesetzt. Eine AWS CDK App kann mehrere Stapel enthalten, und Ressourcen in einem Stapel können auf Ressourcen in einem anderen Stapel verweisen.

TypeScript

Aktualisieren Sie lib/hello-ecs-stack.ts, so dass es Folgendem entspricht.

import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as ecs from 'aws-cdk-lib/aws-ecs'; import * as ecsp from 'aws-cdk-lib/aws-ecs-patterns'; export class HelloEcsStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); new ecsp.ApplicationLoadBalancedFargateService(this, 'MyWebServer', { taskImageOptions: { image: ecs.ContainerImage.fromRegistry('amazon/amazon-ecs-sample'), }, publicLoadBalancer: true }); } }
JavaScript

Aktualisieren Sie lib/hello-ecs-stack.js, so dass es Folgendem entspricht.

const cdk = require('aws-cdk-lib'); const { Construct } = require('constructs'); const ecs = require('aws-cdk-lib/aws-ecs'); const ecsp = require('aws-cdk-lib/aws-ecs-patterns'); class HelloEcsStack extends cdk.Stack { constructor(scope = Construct, id = string, props = cdk.StackProps) { super(scope, id, props); new ecsp.ApplicationLoadBalancedFargateService(this, 'MyWebServer', { taskImageOptions: { image: ecs.ContainerImage.fromRegistry('amazon/amazon-ecs-sample'), }, publicLoadBalancer: true }); } } module.exports = { HelloEcsStack }
Python

Aktualisieren Sie hello-ecs/hello_ecs_stack.py, so dass es Folgendem entspricht.

import aws_cdk as cdk from constructs import Construct import aws_cdk.aws_ecs as ecs import aws_cdk.aws_ecs_patterns as ecsp class HelloEcsStack(cdk.Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) ecsp.ApplicationLoadBalancedFargateService(self, "MyWebServer", task_image_options=ecsp.ApplicationLoadBalancedTaskImageOptions( image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")), public_load_balancer=True )
Java

Aktualisieren Sie src/main/java/com.myorg/HelloEcsStack.java, so dass es Folgendem entspricht.

package com.myorg; import software.constructs.Construct; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.services.ecs.ContainerImage; import software.amazon.awscdk.services.ecs.patterns.ApplicationLoadBalancedFargateService; import software.amazon.awscdk.services.ecs.patterns.ApplicationLoadBalancedTaskImageOptions; public class HelloEcsStack extends Stack { public HelloEcsStack(final Construct scope, final String id) { this(scope, id, null); } public HelloEcsStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); ApplicationLoadBalancedFargateService.Builder.create(this, "MyWebServer") .taskImageOptions(ApplicationLoadBalancedTaskImageOptions.builder() .image(ContainerImage.fromRegistry("amazon/amazon-ecs-sample")) .build()) .publicLoadBalancer(true) .build(); } }
C#

Aktualisieren Sie src/HelloEcs/HelloEcsStack.cs, so dass es Folgendem entspricht.

using Amazon.CDK; using Constructs; using Amazon.CDK.AWS.ECS; using Amazon.CDK.AWS.ECS.Patterns; namespace HelloEcs { public class HelloEcsStack : Stack { internal HelloEcsStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { new ApplicationLoadBalancedFargateService(this, "MyWebServer", new ApplicationLoadBalancedFargateServiceProps { TaskImageOptions = new ApplicationLoadBalancedTaskImageOptions { Image = ContainerImage.FromRegistry("amazon/amazon-ecs-sample") }, PublicLoadBalancer = true }); } } }
Go

Aktualisieren Sie hello-ecs.go, so dass es Folgendem entspricht.

package main import ( "github.com/aws/aws-cdk-go/awscdk/v2" // "github.com/aws/aws-cdk-go/awscdk/v2/awssqs" "github.com/aws/aws-cdk-go/awscdk/v2/awsecs" "github.com/aws/aws-cdk-go/awscdk/v2/awsecspatterns" "github.com/aws/constructs-go/constructs/v10" "github.com/aws/jsii-runtime-go" ) type HelloEcsStackProps struct { awscdk.StackProps } func NewHelloEcsStack(scope constructs.Construct, id string, props *HelloEcsStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) // The code that defines your stack goes here // example resource // queue := awssqs.NewQueue(stack, jsii.String("HelloEcsQueue"), &awssqs.QueueProps{ // VisibilityTimeout: awscdk.Duration_Seconds(jsii.Number(300)), // }) res := awsecspatterns.NewApplicationLoadBalancedFargateService(stack, jsii.String("MyWebServer"), &awsecspatterns.ApplicationLoadBalancedFargateServiceProps{ TaskImageOptions: &awsecspatterns.ApplicationLoadBalancedTaskImageOptions{ Image: awsecs.ContainerImage_FromRegistry(jsii.String("amazon/amazon-ecs-sample"), &awsecs.RepositoryImageProps{}), }, }, ) awscdk.NewCfnOutput(stack, jsii.String("LoadBalancerDNS"), &awscdk.CfnOutputProps{Value: res.LoadBalancer().LoadBalancerDnsName()}) return stack } func main() { defer jsii.Close() app := awscdk.NewApp(nil) NewHelloEcsStack(app, "HelloEcsStack", &HelloEcsStackProps{ awscdk.StackProps{ Env: env(), }, }) app.Synth(nil) } // env determines the AWS environment (account+region) in which our stack is to // be deployed. For more information see: https://docs.aws.amazon.com/cdk/latest/guide/environments.html func env() *awscdk.Environment { // If unspecified, this stack will be "environment-agnostic". // Account/Region-dependent features and context lookups will not work, but a // single synthesized template can be deployed anywhere. //--------------------------------------------------------------------------- return nil // Uncomment if you know exactly what account and region you want to deploy // the stack to. This is the recommendation for production stacks. //--------------------------------------------------------------------------- // return &awscdk.Environment{ // Account: jsii.String("123456789012"), // Region: jsii.String("us-east-1"), // } // Uncomment to specialize this stack for the AWS Account and Region that are // implied by the current CLI configuration. This is recommended for dev // stacks. //--------------------------------------------------------------------------- // return &awscdk.Environment{ // Account: jsii.String(os.Getenv("CDK_DEFAULT_ACCOUNT")), // Region: jsii.String(os.Getenv("CDK_DEFAULT_REGION")), // } }

Das vorangegangene kurze Snippet beinhaltet Folgendes:

  • Der logische Name des Dienstes: MyWebServer.

  • Das Container-Image, das abgerufen wurde von DockerHub:amazon/amazon-ecs-sample.

  • Andere relevante Informationen, wie die Tatsache, dass der Load Balancer eine öffentliche Adresse hat und über das Internet zugänglich ist.

Das erstellt AWS CDK alle Ressourcen, die für die Bereitstellung des Webservers erforderlich sind, einschließlich der folgenden Ressourcen. Diese Ressourcen wurden in diesem Beispiel weggelassen.

  • ECSAmazon-Cluster

  • Amazon VPC - und EC2 Amazon-Instances

  • Auto Scaling-Gruppe

  • Application Load Balancer

  • IAM-Rollen und -Richtlinien

Einige automatisch bereitgestellte Ressourcen werden von allen im Stack definierten ECS Amazon-Services gemeinsam genutzt.

Speichern Sie die Quelldatei, und führen Sie dann das Kommando cdk synth im Hauptverzeichnis Ihrer App aus. Der AWS CDK führt die App aus, synthetisiert daraus eine AWS CloudFormation Vorlage und zeigt dann die Vorlage an. Die Vorlage ist eine Datei mit etwa 600 Zeilen. YAML Der Anfang der Datei wird hier gezeigt. Ihre Vorlage kann sich von diesem Beispiel unterscheiden.

Resources: MyWebServerLB3B5FD3AB: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: LoadBalancerAttributes: - Key: deletion_protection.enabled Value: "false" Scheme: internet-facing SecurityGroups: - Fn::GetAtt: - MyWebServerLBSecurityGroup01B285AA - GroupId Subnets: - Ref: EcsDefaultClusterMnL3mNNYNVpcPublicSubnet1Subnet3C273B99 - Ref: EcsDefaultClusterMnL3mNNYNVpcPublicSubnet2Subnet95FF715A Type: application DependsOn: - EcsDefaultClusterMnL3mNNYNVpcPublicSubnet1DefaultRouteFF4E2178 - EcsDefaultClusterMnL3mNNYNVpcPublicSubnet2DefaultRouteB1375520 Metadata: aws:cdk:path: HelloEcsStack/MyWebServer/LB/Resource MyWebServerLBSecurityGroup01B285AA: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Automatically created Security Group for ELB HelloEcsStackMyWebServerLB06757F57 SecurityGroupIngress: - CidrIp: 0.0.0.0/0 Description: Allow from anyone on port 80 FromPort: 80 IpProtocol: tcp ToPort: 80 VpcId: Ref: EcsDefaultClusterMnL3mNNYNVpc7788A521 Metadata: aws:cdk:path: HelloEcsStack/MyWebServer/LB/SecurityGroup/Resource # and so on for another few hundred lines

Um den Dienst in Ihrem bereitzustellen AWS-Konto, führen Sie den cdk deploy Befehl im Hauptverzeichnis Ihrer Anwendung aus. Sie werden aufgefordert, die AWS CDK generierten IAM Richtlinien zu genehmigen.

Die Bereitstellung dauert mehrere Minuten, in denen mehrere Ressourcen AWS CDK erstellt werden. Die letzten Zeilen der Ausgabe der Bereitstellung enthalten den öffentlichen Hostnamen des Load Balancers und den Ihres neuen Webservers. URL Diese sind Folgende:

Outputs: HelloEcsStack.MyWebServerLoadBalancerDNSXXXXXXX = Hello-MyWeb-ZZZZZZZZZZZZZ-ZZZZZZZZZZ.us-west-2.elb.amazonaws.com HelloEcsStack.MyWebServerServiceURLYYYYYYYY = http://Hello-MyWeb-ZZZZZZZZZZZZZ-ZZZZZZZZZZ.us-west-2.elb.amazonaws.com

Schritt 3: Test des Webservers

Kopieren Sie die Ausgabe URL aus der Bereitstellung und fügen Sie sie in Ihren Webbrowser ein. Die folgende Willkommensnachricht vom Webserver wird angezeigt.

Screenshot der ECS Amazon-Beispielanwendung. Die Ausgabe zeigt an, dass „Ihre Anwendung jetzt bei Amazon läuftECS“.

Schritt 4: Bereinigen

Wenn Sie mit dem Webserver fertig sind, beenden Sie den Dienst mithilfe von, CDK indem Sie den cdk destroy Befehl im Hauptverzeichnis Ihrer Anwendung ausführen. Auf diese Weise wird verhindert, dass Ihnen zukünftig unbeabsichtigte Gebühren anfallen.

Nächste Schritte

Weitere Informationen zur Entwicklung einer AWS Infrastruktur mithilfe von finden Sie im AWS CDK Entwicklerhandbuch. AWS CDK

Informationen zum Schreiben von AWS CDK Apps in der Sprache Ihrer Wahl finden Sie im Folgenden:

TypeScript

Arbeiten mit AWS CDK dem TypeScript

JavaScript

Ich arbeite mit dem AWS CDK Eingang JavaScript

Python

Arbeiten mit dem AWS CDK in Python

Java

Arbeiten mit dem AWS CDK in Java

C#

Arbeiten mit dem AWS CDK in C#

Go

Arbeiten mit dem AWS CDK in Go

Weitere Informationen zu den in diesem Thema verwendeten AWS Construct-Library-Modulen finden Sie in den folgenden AWS CDK API Referenzübersichten.