[PYTHON] Créez un environnement WardPress sur AWS avec Pulumi

introduction

La dernière fois, j'ai construit la configuration de base (environnement ec2 + rds) pour exécuter des applications Web sur pulumi sur AWS article précédent.

Cette fois, nous allons construire la configuration de site Web dynamique ALB + ec2 avec pulumi. Exécutez également WordPress (conteneur docker) dans l'environnement AWS construit avec pulumi.

Diagramme

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

Code réel

Code entier

C'est le code pulumi créé cette fois.

__main__.py


import pulumi
import pulumi_aws as aws

#Créer un VPC
vpc = aws.ec2.Vpc(
    "pulumi-vpc",
    cidr_block="10.0.0.0/16",
    tags={
        "Name": "pulumi-vpc",
    })

#Créer un sous-réseau
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)

#Créer une passerelle Internet
igw = aws.ec2.InternetGateway(
    "pulumi-igw",
    tags={
        "Name": "pulumi-igw",
    },
    vpc_id=vpc.id)

#Créer un EIP
ngw_eip_a = aws.ec2.Eip("pulumi-ngw-eip-a")

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

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

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

#Créer une RouteTable
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)

#Créer une 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)

#Créer un groupe de sécurité
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)

#Créer une paire de clés
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",
    })

#Créer un groupe cible
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)

#Lecture des données utilisateur
file = open("./user-data")
user_data = file.read()

#Création d'une configuration de lancement
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()

#Création d'un groupe Auto Scaling
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
    ])

#Créer un équilibreur de charge
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",
    })

#Créer un auditeur
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")

#Création d'un groupe de sous-réseaux RDS
rds_subnet = aws.rds.SubnetGroup(
    "pulumi-rds-subnet",
    subnet_ids=[
        private_subnet_a.id,
        private_subnet_c.id,
    ],
    tags={
        "Name": "pulumi-rds-subnet",
    })

#Créer une instance RDS
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

Passerelle NAT, table de routage (pour sous-réseau privé)

Cette fois, lancez EC2, qui héberge l'application, avec un sous-réseau privé. Création de la passerelle NAT et de la table de routage pour que EC2 puisse accéder à Internet

#Création d'un EIP à associer à la passerelle NAT
ngw_eip_a = aws.ec2.Eip("pulumi-ngw-eip-a")

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

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

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

#Créer une RouteTable pour un sous-réseau privé
#Ajout d'une route pour la passerelle NAT
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)

#Lier la table de routage et le sous-réseau
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 Créer une configuration de lancement et un groupe Auto Scaling Créez également un TargetGroup pour lier ALB et AutoScalingGroup.

#Créer un groupe cible
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)

#Lecture des données utilisateur
file = open("./user-data")
user_data = file.read()

#Création d'une configuration de lancement
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()

#Création d'un groupe Auto Scaling
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
    ])

À propos du paramétrage de health_check de TargetGroup Puisqu'il est redirigé lors de l'accès à / de WordPress, le code d'état (302) de la redirection est également ajouté à la valeur de paramètre de matcher.

À propos des données utilisateur de LaunchConfiguration, elles sont lues à partir d'un autre fichier Le contenu de user_data sera décrit ultérieurement.

ALB Créez ALB et Listener.

#Créer un équilibreur de charge
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",
    })

#Créer un écouteur (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")

Cette fois, j'ai créé un écouteur avec HTTP, mais lors de la création d'un écouteur HTTPS, il est également nécessaire de définir le certificat, etc. comme suit.

#Créer un écouteur (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")

Données d'utilisateur

Cette fois, démarrez l'image WordPress enregistrée dans le hub Docker. Installez et démarrez Docker et démarrez le conteneur WordPress avec les données utilisateur

user-data


#!/bin/bash

#installation de docker
yum install docker -y

#Démarrez le démon docker
service docker start

#Extraire l'image WordPress
docker pull wordpress

#Lancer un conteneur WordPress
docker run -p 80:80 -d wordpress

Résumé

Cette fois, j'ai créé une configuration AWS typique pour exécuter un site Web dynamique avec pulumi et j'ai démarré le conteneur de docker WordPress.

Les ressources AWS créées dans l'article précédent ne sont pas expliquées en détail cette fois-ci, veuillez donc vous reporter à Article précédent si vous le souhaitez.

prime

Accéder en fait

Paramètres de langue スクリーンショット 2020-07-28 1.46.46.png

Définition des informations de base de données Ici, entrez les paramètres RDS que vous avez créés précédemment. スクリーンショット 2020-07-28 1.47.05.png

Paramètres des informations utilisateur スクリーンショット 2020-07-28 1.48.27.png

Écran après la connexion WordPress スクリーンショット 2020-07-28 1.49.46.png

Recommended Posts

Créez un environnement WardPress sur AWS avec Pulumi
Créez un environnement python avec ansible sur centos6
# 2 Créez un environnement Python avec une instance EC2 d'AWS (ubuntu18.04)
Créer un environnement python3 sur CentOS7
Créez facilement un environnement de développement avec Laragon
Construire un environnement python sur MacOS (Catallina)
Créer un environnement Tensorflow avec Raspberry Pi [2020]
Créez un environnement d'API rapide avec docker-compose
Créer un environnement Python avec Anaconda sur Mac
[Linux] Créer un environnement Jenkins avec Docker
Créez un environnement virtuel pour python avec pyenv
Créer un environnement Python + OpenCV sur Cloud9
Créez un environnement Python moderne avec Neovim
[Linux] Construction de l'environnement Docker avec Amazon Linux 2
Créez un environnement Python 2.7 64 bits avec TDM-GCC et MinGW-w64 sous Windows 7
Créer une application Web de type Flask / Bottle sur AWS Lambda avec Chalice
Créez un environnement Python sur votre Mac avec Anaconda et PyCharm
# 3 Créez un environnement Python (Django) avec une instance EC2 (ubuntu18.04) d'AWS part2
Créez un environnement LAMP sur votre Docker local
Créer un environnement de développement de langage C avec un conteneur
Procédure de création d'un environnement Kube sur Amazon Linux2 (AWS) ~ (avec bonus)
Essayez Tensorflow avec une instance GPU sur AWS
Créer un environnement python avec pyenv sur EC2 (ubuntu)
Créez simplement un environnement d'exécution Python 3 sous Windows
Construisez un environnement Python + bouteille + MySQL avec Docker sur RaspberryPi3! [Construction facile]
Construire un environnement Django sur Raspai (MySQL)
Créer un environnement Python sur Mac (Mountain Lion)
[Python] Créer un environnement de développement Django avec Docker
Créer un environnement de construction python3 avec Sublime Text3
Créez un système de synthèse bon marché avec des composants AWS
Créez un environnement Django avec Vagrant en 5 minutes
Créez un environnement de développement Python sur votre Mac
[Memo] Créez un environnement virtuel avec Pyenv + anaconda
Créez un environnement virtuel avec pyenv et venv
Créer un environnement de développement Django à l'aide de Doker Toolbox
Créer un environnement Kubernetes pour le développement sur Ubuntu
Construire un environnement Python avec OSX Elcapitan
Créez rapidement un environnement Python Django avec IntelliJ
Créer un environnement d'apprentissage automatique Python avec des conteneurs
Construire un environnement de développement Python sur Raspberry Pi
Créer un environnement d'exécution python avec VS Code
Construisez un environnement Python + bouteille + MySQL avec Docker sur RaspberryPi3! [Essai et erreur]
Créer un environnement de développement TensorFlow sur Amazon EC2 avec une copie de commande
Créez facilement du HPC sur AWS avec un cluster AWS Cfn authentique
Créer un environnement de développement Python basé sur GVim sur Windows 10 (3) GVim8.0 et Python3.6
Créer un environnement de développement Django à l'aide de pyenv-virtualenv sur Mac
Créez un environnement virtuel python avec virtualenv et virtualenvwrapper
Créez un environnement de développement local pour Laravel6.X sur votre Mac
Créer un environnement Python d'apprentissage automatique sur Mac OS
Créez un environnement python pour chaque répertoire avec pyenv-virtualenv
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
Créer un environnement de développement Python basé sur GVim sur l'installation de Windows 10 (1)
Comment créer un environnement Django (python) sur Docker
Créer un environnement de développement Python sur Mac OS X
Créez un environnement Python sur votre Mac en utilisant pyenv
Créer un environnement de développement d'applications d'apprentissage automatique avec Python
Créez un environnement virtuel python avec virtualenv et virtualenvwrapper
Créer un environnement de développement Python à l'aide de pyenv sur MacOS
Remarques sur la création d'un environnement virtuel avec Anaconda Navigator
Créez un environnement de développement avec Poetry Django Docker Pycharm
Comment créer un environnement Python sur Amazon Linux 2