WordPress Site in AWS Fargate with RDS DB Backend
Deploys WordPress in ECS Fargate with RDS backend.
This example lives in the pulumi/examples repository. Check out just this directory to use it:
git clone --filter=blob:none --sparse https://github.com/pulumi/examples pulumi-examplesgit -C pulumi-examples sparse-checkout set aws-py-wordpress-fargate-rdscd pulumi-examples/aws-py-wordpress-fargate-rdsThis example serves a WordPress site in AWS ECS Fargate using an RDS MySQL Backend.
It leverages the following Pulumi concepts/constructs:
- Component Resources: Allows one to create custom resources that encapsulate one’s best practices. In this example, component resource is used to define a “VPC” custom resource, a “Backend” custom resource that sets up the RDS DB, and a “Frontend” resource that sets up the ECS cluster and load balancer and tasks.
- Other Providers: Beyond the providers for the various clouds and Kubernetes, etc, Pulumi allows one to create and manage non-cloud resources. In this case, the program uses the Random provider to create a random password if necessary.
This sample uses the following AWS products (and related Pulumi providers):
- Amazon VPC: Used to set up a new virtual network in which the system is deployed.
- Amazon RDS: A managed DB service used to provide the MySQL backend for WordPress.
- Amazon ECS Fargate: A container service used to run the WordPress frontend.
Getting Started#
There are no required configuration parameters for this project since the code will use defaults or generate values as needed - see the beginning of __main__.py to see the defaults.
However, you can override these defaults by using pulumi config to set the following values (e.g. pulumi config set service_name my-wp-demo).
service_name- This is used as a prefix for resources created by the Pulumi program.db_name- The name of the MySQL DB created in RDS.db_user- The user created with access to the MySQL DB.db_password- The password for the DB user. Be sure to use--secretif creating this config value (e.g.pulumi config set db_password --secret).
Deploying and running the program#
Note: some values in this example will be different from run to run.
-
Create a new stack:
Terminal window pulumi stack init lamp-test -
Set the AWS region:
Terminal window pulumi config set aws:region us-west-2 -
Run
pulumi upto preview and deploy changes. After the preview is shown you will be prompted if you want to continue or not. Note: If you set thedb_passwordin the configuration as described above, you will not see theRandomPasswordresource below.Terminal window pulumi up+ pulumi:pulumi:Stack lamp-rds-wordpress-testing create+ ├─ custom:resource:VPC wp-example-net create+ │ ├─ aws:ec2:Vpc wp-example-net-vpc create+ pulumi:pulumi:Stack lamp-rds-wordpress-testing create.+ pulumi:pulumi:Stack lamp-rds-wordpress-testing create+ │ ├─ aws:ec2:Subnet wp-example-net-subnet-us-west-2a create+ │ ├─ aws:ec2:Subnet wp-example-net-subnet-us-west-2b create+ │ ├─ aws:ec2:SecurityGroup wp-example-net-rds-sg create+ │ ├─ aws:ec2:SecurityGroup wp-example-net-fe-sg create+ │ ├─ aws:ec2:RouteTableAssociation vpc-route-table-assoc-us-west-2a create+ │ └─ aws:ec2:RouteTableAssociation vpc-route-table-assoc-us-west-2b create+ ├─ random:index:RandomPassword db_password create+ ├─ custom:resource:Backend wp-example-be create+ │ ├─ aws:rds:SubnetGroup wp-example-be-sng create+ │ └─ aws:rds:Instance wp-example-be-rds create+ └─ custom:resource:Frontend wp-example-fe create+ ├─ aws:ecs:Cluster wp-example-fe-ecs create+ ├─ aws:iam:Role wp-example-fe-task-role create+ ├─ aws:lb:TargetGroup wp-example-fe-app-tg create+ ├─ aws:iam:RolePolicyAttachment wp-example-fe-task-policy create+ ├─ aws:lb:LoadBalancer wp-example-fe-alb create+ ├─ aws:lb:Listener wp-example-fe-listener create+ └─ aws:ecs:Service wp-example-fe-app-svc create -
The program outputs the following values:
DB Endpoint: This is the RDS DB endpoint. By default, the DB is deployed to disallow public access. This can be overriden in the resource declaration for the backend.DB Password: This is managed as a secret. To see the value, you can usepulumi stack output --show-secretsDB User Name: The user name for access the DB.ECS Cluster Name: The name of the ECS cluster created by the stack.Web Service URL: This is a link to the load balancer fronting the WordPress container. Note: It may take a few minutes for AWS to complete deploying the service and so you may see a 503 error initially.
- To clean up resources, run
pulumi destroyand answer the confirmation question at the prompt.
Troubleshooting#
503 Error for the Web Service#
AWS can take a few minutes to complete deploying the WordPress container and connect the load balancer to the service. So you may see a 503 error for a few minutes right after launching the stack. You can see the status of the service by looking at the cluster in AWS.
Deployment Speed#
Since the stack creates an RDS instance, ECS cluster, load balancer, ECS service, as well as other elements, the stack can take about 4-5 minutes to launch and become ready.
