[PYTHON] Erstellen Sie mit pulumi eine WardPress-Umgebung auf AWS

Einführung

Beim letzten Mal habe ich die Grundkonfiguration (ec2 + rds-Umgebung) für die Ausführung von Webanwendungen auf pulumi unter AWS erstellt vorheriger Artikel.

Dieses Mal werden wir die dynamische Website-Konfiguration von ALB + ec2 mit pulumi erstellen. Darüber hinaus wird WordPress (Docker-Container) in der mit pulumi erstellten AWS-Umgebung betrieben.

Diagramm

スクリーンショット 2020-07-28 0.38.26.png

Tatsächlicher Code

Ganzer Code

Es wird der Code von Pulumi sein, der dieses Mal erstellt wird

__main__.py


import pulumi
import pulumi_aws as aws

#Erstellen einer VPC
vpc = aws.ec2.Vpc(
    "pulumi-vpc",
    cidr_block="10.0.0.0/16",
    tags={
        "Name": "pulumi-vpc",
    })

#Subnetz erstellen
public_subnet_a = aws.ec2.Subnet(
    "pulumi-public-subnet-a",
    cidr_block="10.0.1.0/24",
    availability_zone="ap-northeast-1a",
    tags={
        "Name": "pulumi-public-subnet-a",
    },
    vpc_id=vpc.id)

public_subnet_c = aws.ec2.Subnet(
    "pulumi-public-subnet-c",
    cidr_block="10.0.2.0/24",
    availability_zone="ap-northeast-1c",
    tags={
        "Name": "pulumi-public-subnet-c",
    },
    vpc_id=vpc.id)

private_subnet_a = aws.ec2.Subnet(
    "pulumi-private-subnet-a",
    cidr_block="10.0.3.0/24",
    availability_zone="ap-northeast-1a",
    tags={
        "Name": "pulumi-private-subnet-a",
    },
    vpc_id=vpc.id)

private_subnet_c = aws.ec2.Subnet(
    "pulumi-private-subnet-c",
    cidr_block="10.0.4.0/24",
    availability_zone="ap-northeast-1c",
    tags={
        "Name": "pulumi-private-subnet-c",
    },
    vpc_id=vpc.id)

#Erstellen eines Internet-Gateways
igw = aws.ec2.InternetGateway(
    "pulumi-igw",
    tags={
        "Name": "pulumi-igw",
    },
    vpc_id=vpc.id)

#EIP erstellen
ngw_eip_a = aws.ec2.Eip("pulumi-ngw-eip-a")

ngw_eip_c = aws.ec2.Eip("pulumi-ngw-eip-c")

#Nat Gateway erstellen
ngw_a = aws.ec2.NatGateway(
    "pulumi-ngw-a",
    allocation_id=ngw_eip_a.id,
    subnet_id=public_subnet_a.id)

#Nat Gateway erstellen
ngw_c = aws.ec2.NatGateway(
    "pulumi-ngw-c",
    allocation_id=ngw_eip_c.id,
    subnet_id=public_subnet_c.id)

#Erstellen einer Routentabelle
public_route_table_a = aws.ec2.RouteTable(
    "pulumi-public-route-table-a",
    routes=[
        {
            "cidr_block": "0.0.0.0/0",
            "gateway_id": igw.id,
        },
    ],
    tags={
        "Name": "pulumi-public-route-table-a",
    },
    vpc_id=vpc.id)

public_route_table_c = aws.ec2.RouteTable(
    "pulumi-public-route-table-c",
    routes=[
        {
            "cidr_block": "0.0.0.0/0",
            "gateway_id": igw.id,
        },
    ],
    tags={
        "Name": "pulumi-public-route-table-c",
    },
    vpc_id=vpc.id)

private_route_table_a = aws.ec2.RouteTable(
    "pulumi-private-route-table-a",
    routes=[
        {
            "cidr_block": "0.0.0.0/0",
            "nat_gateway_id": ngw_a.id,
        },
    ],
    tags={
        "Name": "pulumi-private-route-table-a",
    },
    vpc_id=vpc.id)

private_route_table_c = aws.ec2.RouteTable(
    "pulumi-private-route-table-c",
    routes=[
        {
            "cidr_block": "0.0.0.0/0",
            "nat_gateway_id": ngw_c.id,
        },
    ],
    tags={
        "Name": "pulumi-private-route-table-c",
    },
    vpc_id=vpc.id)

#Erstellen einer RouteTableAssociation
route_table_association_public_a = aws.ec2.RouteTableAssociation(
    "pulumi-route-table-association-public-a",
    subnet_id=public_subnet_a.id,
    route_table_id=public_route_table_a.id)

route_table_association_public_c = aws.ec2.RouteTableAssociation(
    "pulumi-route-table-association-public-c",
    subnet_id=public_subnet_c.id,
    route_table_id=public_route_table_c.id)

route_table_association_private_a = aws.ec2.RouteTableAssociation(
    "pulumi-route-table-association-private-a",
    subnet_id=private_subnet_a.id,
    route_table_id=private_route_table_a.id)

route_table_association_private_c = aws.ec2.RouteTableAssociation(
    "pulumi-route-table-association-private-c",
    subnet_id=private_subnet_c.id,
    route_table_id=private_route_table_c.id)

#Erstellen einer Sicherheitsgruppe
alb_sg = aws.ec2.SecurityGroup(
    "pulumi-alb-sg",
    ingress=[
        {
            "from_port": 80,
            "protocol": "TCP",
            "to_port": 80,
            "cidr_blocks": ["0.0.0.0/0"]
        },
    ],
    egress=[
        {
            "from_port": 0,
            "protocol": "TCP",
            "to_port": 65535,
            "cidr_blocks": ["0.0.0.0/0"]
        },
    ],
    tags={
        "Name": "pulumi-alb-sg",
    },
    vpc_id=vpc.id)

ec2_sg = aws.ec2.SecurityGroup(
    "pulumi-ec2-sg",
    ingress=[
        {
            "from_port": 80,
            "protocol": "TCP",
            "to_port": 80,
            "security_groups": [alb_sg.id]
        },
    ],
    egress=[
        {
            "from_port": 0,
            "protocol": "TCP",
            "to_port": 65535,
            "cidr_blocks": ["0.0.0.0/0"]
        },
    ],
    tags={
        "Name": "pulumi-ec2-sg",
    },
    vpc_id=vpc.id)

rds_sg = aws.ec2.SecurityGroup(
    "pulumi-rds-sg",
    ingress=[
        {
            "from_port": 3306,
            "protocol": "TCP",
            "to_port": 3306,
            "security_groups": [ec2_sg.id]
        },
    ],
    egress=[
        {
            "from_port": 0,
            "protocol": "TCP",
            "to_port": 65535,
            "cidr_blocks": ["0.0.0.0/0"]
        },
    ],
    tags={
        "Name": "pulumi-rds-sg",
    },
    vpc_id=vpc.id)

#Erstellen eines Schlüsselpaars
key_pair = aws.ec2.KeyPair(
    "pulumi-keypair",
    public_key="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 [email protected]",
    tags={
        "Name": "pulumi-keypair",
    })

#Erstellen einer Zielgruppe
target_group = aws.alb.TargetGroup(
    "pulumi-target-group",
    health_check={
        "healthyThreshold": 5,
        "interval": 30,
        "matcher": "200,302",
        "path": "/",
        "protocol": "HTTP",
        "timeout": 5,
        "unhealthyThreshold": 2
    },
    name="pulumi-target-group",
    port=80,
    protocol="HTTP",
    tags={
        "Name": "pulumi-target-group",
    },
    target_type="instance",
    vpc_id=vpc.id)

#Benutzerdaten lesen
file = open("./user-data")
user_data = file.read()

#Erstellen einer Startkonfiguration
launch_conf = aws.ec2.LaunchConfiguration(
    "pulumi-launch-conf",
    image_id="ami-0ee1410f0644c1cac",
    instance_type="t2.micro",
    associate_public_ip_address=True,
    key_name=key_pair.key_name,
    security_groups=[ec2_sg.id],
    user_data=user_data)

file.close()

#Erstellen einer automatischen Skalierungsgruppe
autoscaling_group = aws.autoscaling.Group(
    "pulumi-autoscaling-group",
    availability_zones=["ap-northeast-1a", "ap-northeast-1c"],
    health_check_type="ELB",
    desired_capacity=1,
    launch_configuration=launch_conf.name,
    max_size=1,
    min_size=1,
    target_group_arns=[target_group.arn],
    vpc_zone_identifiers=[
        private_subnet_a.id,
        private_subnet_c.id
    ])

#Erstellen eines Load Balancers
alb = aws.alb.LoadBalancer(
    "pulumi-alb",
    load_balancer_type="application",
    name="pulumi-alb",
    security_groups=[alb_sg.id],
    subnets=[
        public_subnet_a.id,
        public_subnet_c.id
    ],
    tags={
        "Name": "pulumi-alb",
    })

#Listener erstellen
alb_listener = aws.alb.Listener(
    "pulumi-alb-listener",
    default_actions=[{
        "target_group_arn": target_group.arn,
        "type": "forward",
    }],
    load_balancer_arn=alb.arn,
    port="80",
    protocol="HTTP")

#Erstellen einer RDS-Subnetzgruppe
rds_subnet = aws.rds.SubnetGroup(
    "pulumi-rds-subnet",
    subnet_ids=[
        private_subnet_a.id,
        private_subnet_c.id,
    ],
    tags={
        "Name": "pulumi-rds-subnet",
    })

#Erstellen einer RDS-Instanz
rds = aws.rds.Instance(
    "pulumi-rds",
    allocated_storage=20,
    db_subnet_group_name=rds_subnet.name,
    engine="mysql",
    engine_version="5.7",
    identifier="pulumi-rds",
    instance_class="db.t2.micro",
    name="pulumi",
    parameter_group_name="default.mysql5.7",
    password="password",
    skip_final_snapshot=True,
    storage_type="gp2",
    tags={
        "Name": "pulumi-rds",
    },
    username="admin",
    vpc_security_group_ids=[rds_sg.id])

user-data


#!/bin/bash

yum install docker -y

service docker start

docker pull wordpress

docker run -p 80:80 -d wordpress

NAT Gateway, Routentabelle (für privates Subnetz)

Starten Sie diesmal EC2, das die Anwendung hostet, mit einem privaten Subnetz. NAT-Gateway und Routentabelle dafür erstellt, damit EC2 ins Internet gelangen kann

#Erstellen einer EIP zur Zuordnung zu NAT Gateway
ngw_eip_a = aws.ec2.Eip("pulumi-ngw-eip-a")

ngw_eip_c = aws.ec2.Eip("pulumi-ngw-eip-c")

#Nat Gateway erstellen
ngw_a = aws.ec2.NatGateway(
    "pulumi-ngw-a",
    allocation_id=ngw_eip_a.id,
    subnet_id=public_subnet_a.id)

#Nat Gateway erstellen
ngw_c = aws.ec2.NatGateway(
    "pulumi-ngw-c",
    allocation_id=ngw_eip_c.id,
    subnet_id=public_subnet_c.id)

#Erstellen einer RouteTable für ein privates Subnetz
#Route für NAT Gateway hinzufügen
private_route_table_a = aws.ec2.RouteTable(
    "pulumi-private-route-table-a",
    routes=[
        {
            "cidr_block": "0.0.0.0/0",
            "nat_gateway_id": ngw_a.id,
        },
    ],
    tags={
        "Name": "pulumi-private-route-table-a",
    },
    vpc_id=vpc.id)

private_route_table_c = aws.ec2.RouteTable(
    "pulumi-private-route-table-c",
    routes=[
        {
            "cidr_block": "0.0.0.0/0",
            "nat_gateway_id": ngw_c.id,
        },
    ],
    tags={
        "Name": "pulumi-private-route-table-c",
    },
    vpc_id=vpc.id)

#Routentabelle und Subnetz verbinden
route_table_association_private_a = aws.ec2.RouteTableAssociation(
    "pulumi-route-table-association-private-a",
    subnet_id=private_subnet_a.id,
    route_table_id=private_route_table_a.id)

route_table_association_private_c = aws.ec2.RouteTableAssociation(
    "pulumi-route-table-association-private-c",
    subnet_id=private_subnet_c.id,
    route_table_id=private_route_table_c.id)

LaunchConfiguration、AutoScalingGroup、TargetGroup Erstellen Sie eine Startkonfiguration und eine automatische Skalierungsgruppe Erstellen Sie außerdem eine Zielgruppe, um ALB und AutoScalingGroup zu verknüpfen.

#Erstellen einer Zielgruppe
target_group = aws.alb.TargetGroup(
    "pulumi-target-group",
    health_check={
        "healthyThreshold": 5,
        "interval": 30,
        "matcher": "200,302",
        "path": "/",
        "protocol": "HTTP",
        "timeout": 5,
        "unhealthyThreshold": 2
    },
    name="pulumi-target-group",
    port=80,
    protocol="HTTP",
    tags={
        "Name": "pulumi-target-group",
    },
    target_type="instance",
    vpc_id=vpc.id)

#Benutzerdaten lesen
file = open("./user-data")
user_data = file.read()

#Erstellen einer Startkonfiguration
launch_conf = aws.ec2.LaunchConfiguration(
    "pulumi-launch-conf",
    image_id="ami-0ee1410f0644c1cac",
    instance_type="t2.micro",
    associate_public_ip_address=True,
    key_name=key_pair.key_name,
    security_groups=[ec2_sg.id],
    user_data=user_data)

file.close()

#Erstellen einer automatischen Skalierungsgruppe
autoscaling_group = aws.autoscaling.Group(
    "pulumi-autoscaling-group",
    availability_zones=["ap-northeast-1a", "ap-northeast-1c"],
    health_check_type="ELB",
    desired_capacity=1,
    launch_configuration=launch_conf.name,
    max_size=1,
    min_size=1,
    target_group_arns=[target_group.arn],
    vpc_zone_identifiers=[
        private_subnet_a.id,
        private_subnet_c.id
    ])

Informationen zur Einstellung von "health_check" in TargetGroup Da es beim Zugriff auf / von WordPress umgeleitet wird, wird der Statuscode (302) von redirect auch zum Einstellungswert von matcher hinzugefügt.

Informationen zu Benutzerdaten von LaunchConfiguration werden aus einer anderen Datei gelesen Der Inhalt von user_data wird später beschrieben.

ALB Erstellen Sie ALB und Listener.

#Erstellen eines Load Balancers
alb = aws.alb.LoadBalancer(
    "pulumi-alb",
    load_balancer_type="application",
    name="pulumi-alb",
    security_groups=[alb_sg.id],
    subnets=[
        public_subnet_a.id,
        public_subnet_c.id
    ],
    tags={
        "Name": "pulumi-alb",
    })

#Listener erstellen (HTTP)
alb_listener = aws.alb.Listener(
    "pulumi-alb-listener",
    default_actions=[{
        "target_group_arn": target_group.arn,
        "type": "forward",
    }],
    load_balancer_arn=alb.arn,
    port="80",
    protocol="HTTP")

Dieses Mal habe ich einen Listener mit HTTP erstellt, aber beim Erstellen eines HTTPS-Listeners muss das Zertifikat usw. auch wie folgt festgelegt werden.

#Listener erstellen (HTTPS)
alb_listener = aws.alb.Listener(
    "pulumi-alb-listener",
    certificate_arn="arn:aws:iam::187416307283:server-certificate/test_cert_rab3wuqwgja25ct3n4jdj2tzu4",
    default_actions=[{
        "target_group_arn": target_group.arn,
        "type": "forward",
    }],
    load_balancer_arn=alb.arn,
    port="443",
    protocol="HTTPS",
    ssl_policy="ELBSecurityPolicy-2016-08")

Benutzerdaten

Starten Sie dieses Mal das im Docker-Hub registrierte WordPress-Image. Installieren und starten Sie Docker und starten Sie den WordPress-Container mit Benutzerdaten

user-data


#!/bin/bash

#Docker installieren
yum install docker -y

#Starten Sie den Docker-Daemon
service docker start

#Ziehen Sie das WordPress-Bild
docker pull wordpress

#Starten Sie einen WordPress-Container
docker run -p 80:80 -d wordpress

Zusammenfassung

Dieses Mal habe ich eine typische AWS-Konfiguration zum Ausführen einer dynamischen Website mit pulumi erstellt und den WordPress-Docker-Container gestartet.

Die im vorherigen Artikel erstellten AWS-Ressourcen werden dieses Mal nicht ausführlich erläutert. Weitere Informationen finden Sie unter Vorheriger Artikel.

Bonus

Eigentlich Zugriff

Spracheinstellungen スクリーンショット 2020-07-28 1.46.46.png

Datenbankinformationen einstellen Geben Sie hier die zuvor erstellten RDS-Einstellungen ein. スクリーンショット 2020-07-28 1.47.05.png

Benutzerinformationseinstellungen スクリーンショット 2020-07-28 1.48.27.png

Bildschirm nach WordPress-Login スクリーンショット 2020-07-28 1.49.46.png

Recommended Posts

Erstellen Sie mit pulumi eine WardPress-Umgebung auf AWS
Erstellen Sie eine Python-Umgebung mit ansible auf centos6
# 2 Erstellen Sie eine Python-Umgebung mit einer EC2-Instanz von AWS (ubuntu18.04).
Erstellen Sie eine Python3-Umgebung unter CentOS7
Erstellen Sie mit Laragon ganz einfach eine Entwicklungsumgebung
Erstellen Sie eine Python-Umgebung unter MacOS (Catallina)
Erstellen Sie eine Tensorflow-Umgebung mit Raspberry Pi [2020]
Erstellen Sie mit Docker-Compose eine schnelle API-Umgebung
Erstellen Sie eine Python-Umgebung mit Anaconda auf einem Mac
[Linux] Erstellen einer Jenkins-Umgebung mit Docker
Erstellen Sie mit pyenv eine virtuelle Umgebung für Python
Erstellen Sie eine Python + OpenCV-Umgebung in Cloud9
Erstellen Sie mit Neovim eine moderne Python-Umgebung
[Linux] Aufbau einer Docker-Umgebung mit Amazon Linux 2
Erstellen Sie eine 64-Bit-Python 2.7-Umgebung mit TDM-GCC und MinGW-w64 unter Windows 7
Erstellen Sie mit Chalice eine flaschen- / flaschenähnliche Webanwendung auf AWS Lambda
Erstellen Sie mit Anaconda und PyCharm eine Python-Umgebung auf Ihrem Mac
# 3 Erstellen Sie eine Python-Umgebung (Django) mit einer EC2-Instanz (ubuntu18.04) von AWS part2
Erstellen Sie eine LAMP-Umgebung auf Ihrem lokalen Docker
Erstellen Sie eine Entwicklungsumgebung für die C-Sprache mit einem Container
Vorgehensweise zum Erstellen einer Kube-Umgebung unter Amazon Linux2 (aws) ~ (mit Bonus)
Versuchen Sie Tensorflow mit einer GPU-Instanz unter AWS
Erstellen Sie eine Python-Umgebung mit pyenv auf EC2 (Ubuntu)
Erstellen Sie einfach eine Python 3-Ausführungsumgebung unter Windows
Erstellen Sie mit Docker auf RaspberryPi3 eine Python + Flasche + MySQL-Umgebung! [Einfache Konstruktion]
Erstellen Sie eine Django-Umgebung auf Raspai (MySQL)
Erstellen Sie eine Python-Umgebung auf einem Mac (Mountain Lion)
[Python] Erstellen Sie mit Docker eine Django-Entwicklungsumgebung
Erstellen Sie mit Sublime Text3 eine Python3-Build-Umgebung
Erstellen Sie ein billiges Zusammenfassungssystem mit AWS-Komponenten
Erstellen Sie mit Vagrant in 5 Minuten eine Django-Umgebung
Erstellen Sie eine Python-Entwicklungsumgebung auf Ihrem Mac
[Memo] Erstellen Sie eine virtuelle Umgebung mit Pyenv + anaconda
Erstellen Sie eine virtuelle Umgebung mit pyenv und venv
Erstellen Sie mit der Doker Toolbox eine Django-Entwicklungsumgebung
Erstellen Sie eine Kubernetes-Umgebung für die Entwicklung unter Ubuntu
Erstellen einer Python-Umgebung mit OSX Elcapitan
Erstellen Sie mit IntelliJ schnell eine Python Django-Umgebung
Erstellen Sie eine Python-Umgebung für maschinelles Lernen mit Containern
Erstellen Sie eine Python-Entwicklungsumgebung auf Raspberry Pi
Erstellen Sie eine Python-Ausführungsumgebung mit VS-Code
Erstellen Sie mit Docker auf RaspberryPi3 eine Python + Flasche + MySQL-Umgebung! [Versuch und Irrtum]
Erstellen Sie eine TensorFlow-Entwicklungsumgebung auf Amazon EC2 mit Befehlskopie
Erstellen Sie HPC einfach auf AWS mit echtem AWS Cfn Cluster
Erstellen Sie eine GVim-basierte Python-Entwicklungsumgebung unter Windows 10 (3) GVim8.0 und Python3.6
Erstellen einer Django-Entwicklungsumgebung mit pyenv-virtualenv auf einem Mac
Erstellen Sie eine virtuelle Python-Umgebung mit virtualenv und virtualenvwrapper
Erstellen Sie eine lokale Entwicklungsumgebung für Laravel6.X auf Ihrem Mac
Erstellen Sie eine Python-Umgebung für maschinelles Lernen unter Mac OS
Erstellen Sie mit pyenv-virtualenv eine Python-Umgebung für jedes Verzeichnis
Ich habe eine Python3-Umgebung unter Ubuntu mit direnv erstellt.
Erstellen Sie eine GVim-basierte Python-Entwicklungsumgebung unter Windows 10 (1)
So erstellen Sie eine Django (Python) -Umgebung auf Docker
Erstellen Sie eine Python-Entwicklungsumgebung unter Mac OS X.
Erstellen Sie mit pyenv eine Python-Umgebung auf Ihrem Mac
Erstellen Sie mit Python eine Entwicklungsumgebung für maschinelles Lernen
Erstellen Sie eine virtuelle Python-Umgebung mit virtualenv und virtualenvwrapper
Erstellen Sie eine Python-Entwicklungsumgebung mit pyenv unter MacOS
Hinweise zum Erstellen einer virtuellen Umgebung mit Anaconda Navigator
Erstellen Sie eine Entwicklungsumgebung mit Poetry Django Docker Pycharm
So erstellen Sie eine Python-Umgebung unter Amazon Linux 2