This is the third part of PowerShell's creation of the AWS high-availability blog, and let's look at how the post-half work is done.
Create EC2-S3 role, which is assigned to EC2 virtual machines so that they automatically have access to S3 content after they are created.
Create a VPC Network
Create 2 subnets of a VPC, located in different AZ
Create an Internet gateway
Configure the routing table
Create and configure the EC2 security Group to ensure that 80 and 22 ports are available
Create a highly available MARIADB database
Configure the security Group for the database to ensure that port 3306 is available
Create a S3 Bucket and configure policy
Create CloudFront distribution points, bind S3 buckets
Preparing the WordPress configuration document
Preparing the configuration document for VirtualHost
Uploading the configuration document into the S3 bucket
Configure bash shell scripts, including Lamp,wordpress,aws,crontab and S3 synchronization, and more
Create a EC2 virtual machine, specify the bootstrap command created in 14 steps
Update DNS records, point to the virtual machine
Generate image file after confirmation is correct
Configure Elb
Update DNS records to ELB address
Configuring launch Configuration
Configure Auto Scaling
11. First to prepare the WordPress configuration document.
Download WordPress saved in the corresponding directory, then you can modify the contents of the wp-config.php to bind the database
$content =get-content C:\Users\yli\Downloads\wordpress-4.5.3\wordpress\wp-config-sample.php$content. Replace ("define (' db_name ', ' Database_name_here ')", "Define (' db_name ', ' WordPress ')"). ' Replace (' Define ' (' Db_user ', ' Username_here ') "," Define (' Db_user ', ' WordPress ') "). ' Replace (' Define (' Db_password ', ' password_here ') ', ' Define (' DB _password ', ' WordPress '). ' Replace (' Define (' db_host ', ' localhost ') ', ' Define (' db_host ', ' $adddress ') ') | Set-content C:\USERS\YLI\DOWNLOADS\WORDPRESS-4.5.3\WORDPRESS\WP-CONFIG.PHPGC C:\Users\yli\Downloads\ wordpress-4.5.3\wordpress\wp-config.php
12 Next, you need to configure Apache Vhost file, here I specify the root directory, domain name, already very important point, redirect the local image path to S3 up.
[Email protected] "<virtualhost *:80> ServerName blog.beanxyz.comServerAdmin [email protected] D ocumentroot/var/www/wordpress errorlog ${apache_log_dir}/error.log Customlog ${apache_log_dir}/access.log C ombined rewriteengine on Rewritecond%{http_host}!^$ rewriterule ^/wp-content/uploads (. *) $ http://$ ( $CFD. DomainName)/uploads$1 [r=302]</virtualhost> "@ $vhost | Set-content C:\Users\yli\Downloads\wordpress-4.5.3\wordpress.conf
13. Finally upload to me in the S3 bucket
Write-s3object-bucketname Yuanliwordpress-folder C:\Users\yli\Downloads\wordpress-4.5.3\wordpress-KeyPrefix Wordpress-recursewrite-s3object-bucketname Yuanliwordpress-key Wordpress_vhosts-file C:\users\yli\Downloads\ Wordpress-4.5.3\wordpress.confget-s3object-bucketname yuanliwordpress
650) this.width=650; "src=" Http://s4.51cto.com/wyfs02/M01/84/61/wKioL1ePDwrxd1s4AAHf1H0iQyE032.png "style=" float: none; "title=" 9.PNG "alt=" Wkiol1epdwrxd1s4aahf1h0iqye032.png "/>
14-15 These 2 steps are the most troublesome, I need to bind role, install lamp and WordPress script, also have to automatically copy the configuration file from S3, configure scheduled Tasks, synchronize every minute, and redirect. After the shell script is processed, you can generate an instance of EC2.
#Create ami image# Create EC2 instance # bindings rolenew-iaminstanceprofile -instanceprofilename "WordPress" Add-IAMRoleToInstanceProfile -RoleName EC2-S3 -InstanceProfileName "WordPress" $ Groupid=get-ec2securitygroup | where-object {$_. groupname -eq "WordPress"} | select -expandproperty groupid# configuration lamp and wordpress[ Email protected] "#!/bin/bashapt-get updateapt-get upgrade -yapt-get install -y mysql-client libmysqlclient15-dev apache2 apache2-doc apache2-mpm-prefork Apache2-utils libexpat1 ssl-cert libapache2-mod-php5 php5 php5-common php5-curl php5-dev php5-gd php5-idn php-pear php5-imagick php5-mcrypt php5-mysql php5-ps php5-pspell php5-recode php5-xsl python-pip && pip install awscliaws s3 cp --recursive s3://yuanliwordpress/wordpress /var/www/wordpress/chown -r www-data.www-data wordpresschmod 755 /var/ Www/wordpress/aws s3 cp s3://yuanliwordpress/wordpress_vhosts /etc/apache2/sites-available /wordpress.confcd /etc/apache2/sites-avaiablea2ensite wordpress.confservice apache2 Restartchmod 777 /var/www/wordpress/wp-contentsecho */1 * * * * root aws s3 sync /var/www/wordpress/wp-content/uploads s3://yuanliwordpress/uploads >> /etc/crontaba2enmod rewriteservice apache2 restart "@ $b =[system.text.encoding]:: UTF8. GetBytes ($userdata) $a =[system.convert]::tobase64string ($b) $instance =new-ec2instance -imageid ami-6c14310f -instancetype t2.micro -keyname aws -subnetid $subnet 1 - securitygroupid $groupid -MinCount 1 -MaxCount 1 -InstanceProfile_Name " WordPress " -UserData $a $instanceid= ($instance | select -expand instances) .instanceidwrite-host "Initilizing &NBSP;EC2&NBSP;INSTANCE,&NBSP;PLEASE&NBSP;WAIT&NBSP: " -foregroundcolor cyan -nonewline$state = $falsewhile ($state -eq $false) { $name = (get-ec2instance -instanceid $ Instanceid | select -expandproperty instances | select -expandproperty state). Name if ($name. value -eq "Running") { $state = $true }else{ start-sleep -Seconds 2 write-host "..." -ForegroundColor Cyan -NoNewline }}
It will be available in a few minutes.
650) this.width=650; "src=" Http://s4.51cto.com/wyfs02/M02/84/61/wKioL1ePDw2C1HfhAABMLigVUyk533.png "style=" float: none; "title=" 10.PNG "alt=" Wkiol1epdw2c1hfhaabmligvuyk533.png "/>
The following part of the code is optional, I'm trying to test whether the template works. His main role is actually to update the DNS point to my template EC2 public IP
$publicip =get-ec2instance -instanceid $instanceid | select -ExpandProperty instances | select -expandproperty publicipaddress# Update DNS record write-host "Updating Dns record. " -foregroundcolor cyan$domain=get-r53hostedzonesbyname -dnsname beanxyz.com$hostid=$ Domain.id.Split ("/") [2] $recordsets =get-r53resourcerecordset -hostedzoneid $domain. Id.split ("/") [2] $currentip = $recordsets | select -ExpandProperty resourceRecordSets | where-object {$_.name -eq "blog.beanxyz.com."} | select -ExpandProperty ResourceRecords | select -ExpandProperty Value$type= $recordsets | select -ExpandProperty resourceRecordSets | where-object {$_.name -eq "blog.beanxyz.com."} | select -expandproperty type | select -expandproperty value$change1 = nEw-object amazon.route53.model.change$change1. action = "DELETE" $change 1. Resourcerecordset = new-object amazon.route53.model.resourcerecordset$change1. resourcerecordset.name = "blog.beanxyz.com" $change 1. resourcerecordset.type = $type $change1. Resourcerecordset.ttl = 300$change1. RESOURCERECORDSET.RESOURCERECORDS.ADD (@{value= $currentip}) $change 3 = new-object Amazon.route53.model.change$change3. action = "CREATE" $change 3. Resourcerecordset = new-object amazon.route53.model.resourcerecordset$change3. resourcerecordset.name = "Blog.beanxyz.com" $change 3. resourcerecordset.type = "A" $change 3. Resourcerecordset.ttl = 300$change3. RESOURCERECORDSET.RESOURCERECORDS.ADD (@{value= $publicip}) $params = @{ hostedzoneid= $hostidChangeBatch _comment= "Replace a record of blog.beanxyz.com from $currentip to $publiciP "changebatch_change= $change 1, $change 3}edit-r53resourcerecordset @params $TAGEC 2=new-object Amazon.ec2.model.tag -property @{key= "Name"; value= "WordPress"}new-ec2tag -resource $ instanceid -tag $tagec 2write-host "The wordpress blog is ready. please login to blog.beanxyz.com to finish the inital setup " - Foregroundcolor cyanstart-process http://blog.beanxyz.com
It's easy to go down again. Configure mirroring
#14. Configuring the AMI image new-ec2image-description Templatewordpress-name templatewordpress-instanceid $instanceidGet-ec2image- Owner Self | Unregister-ec2image-passthru
Configure ELB, update DNS records
#Create elb and auto scaling#15. Configuring Elb#create elb$httplistener = new-object -TypeName ' Amazon.ElasticLoadBalancing.Model.Listener ' $HTTPListener .protocol = ' http ' $ Httplistener.instanceport = 80$httplistener.loadbalancerport = 80$groupid= ( Get-ec2securitygroup| where-object {$_. groupname -eq "WordPress"}). Groupid$subnet1= (get-ec2subnet | where-object {$_. cidrblock -eq "10.2.1.0/24"}). Subnetid$subnet2= (get-ec2subnet | where-object {$_. cidrblock -eq "10.2.2.0/24"}). subnetid$elb=new-elbloadbalancer -loadbalancername "Myloadbalance" -Listener $HTTPListener -SecurityGroup $groupid -subnet @ ($subnet 1, $subnet 2) # $elb =get-elbloadbalancer# register-elbinstancewithloadbalancer -loadbalancername "Myloadbalance" -Instance @ ($ INSTANCE2ID) #更新DNS到LoadBalancer上write-host "updating dns Record: " -foregroundcolor cyan$domain=get-r53hostedzonesbyname -dnsname beanxyz.com$hostid=$ Domain.id.Split ("/") [2] $recordsets =get-r53resourcerecordset -hostedzoneid $domain. Id.split ("/") [2] $currentip = $recordsets | select -ExpandProperty resourceRecordSets | where-object {$_.name -eq "blog.beanxyz.com."} | select -ExpandProperty ResourceRecords | select -ExpandProperty Value$change1 = new-object amazon.route53.model.change$change1. action = "DELETE" $change 1. Resourcerecordset = new-object amazon.route53.model.resourcerecordset$change1. resourcerecordset.name = "blog.beanxyz.com" $change 1. resourcerecordset.type = "A" $change 1. Resourcerecordset.ttl = 300$change1. RESOURCERECORDSET.RESOURCERECORDS.ADD (@{value= $currentip}) $change 3 = new-object Amazon.route53.model.change$change3. action = "CREATE" $change 3. Resourcerecordset = new-object amazon.route53.model.resourcerecordset$change3. resourcerecordset.name = "Blog.beanxyz.com" $change 3. resourcerecordset.type = "CNAME" $change 3. Resourcerecordset.ttl = 300$change3. RESOURCERECORDSET.RESOURCERECORDS.ADD (@{value= $elb}) $params = @{ hostedzoneid = $hostidChangeBatch _comment= "replace a record of blog.beanxyz.com from $ currentip to $newname "changebatch_change= $change 1, $change 3}edit-r53resourcerecordset @params
Finally, configure the launch config file and Auto Scaling group. Don't forget to configure Cloudwatch so that he can automatically add or remove instances based on the load
#配置 launch configuration- userdata (Bootstrap) new-aslaunchconfiguration -imageid ( get-ec2image -owner self) .imageid -launchconfigurationname "My-launchconfigurationfile" -InstanceType "T2.micro" -SecurityGroup $groupid -UserData $a -keyname awsNew-ASAutoScalingGroup -AutoScalingGroupName "MY-ASG" -LaunchConfigurationName " My-launchconfigurationfile " -MinSize 1 -MaxSize 3 -LoadBalancerName " Myloadbalance " "-vpczoneidentifier $subnet 1write-asscalingpolicy -autoscalinggroupname my-asg -adjustmenttype "changeincapacity" -PolicyName "Myscaleinpolicy" - scalingadjustment 1 #Remove-asautoscalinggroup -autoscalinggroupname "MY-ASG" $ stepadjustment=new-object amazon.autoscaling.model.stepadjustment $stepadjustment. Metricintervallowerbound=20$stepadjustment. Scalingadjustment=-1write-asscalingpolicy -autoscalinggroupname my-asg -adjustmenttype "Changeincapacity" -PolicyName "MyScaleInPolicy1" -PolicyType "stepscaling" -stepadjustment $ stepadjustmentwrite-cwmetricalarm -actionsenabled $true -Alarmname "Testonly" - Alarmaction {arn:aws:autoscaling:ap-southeast-2:503646143282:scalingpolicy: Fba2d6ec-1566-459a-a3d5-bb800e88f7ad:autoscalinggroupname/my-asg:policyname/myscaleinpolicy1} -namespace "AWS/EC2" -Period 300 -Statistic "Average" -MetricName "Cpuutlilization" '-comparisonoperator ' Lessthanorequaltothreshold " -threshold 60 -evaluationperiod 1
$stepadjustment =new-object Amazon.AutoScaling.Model.StepAdjustment $stepadjustment. Metricintervallowerbound=20$stepadjustment. Scalingadjustment=-1write-asscalingpolicy-autoscalinggroupname My-asg-adjustmenttype "ChangeInCapacity"- PolicyName "MyScaleInPolicy1"-policytype "stepscaling"-stepadjustment $stepadjustmentWrite-cwmetricalarm- actionsenabled $true-alarmname "Testonly"-alarmaction {arn:aws:autoscaling:ap-southeast-2:503646143282: SCALINGPOLICY:4CB293A4-1E6F-4D3E-8C02-2BAEC06EE663:AUTOSCALINGGROUPNAME/MY-ASG:POLICYNAME/MYSCALEINPOLICY1}- Namespace "AWS/EC2"-period 300-statistic "Average"-metricname "cpuutlilization" '-comparisonoperator ' Lessthanorequaltothreshold "-threshold 60-evaluationperiod 1
Last login to see, success
650) this.width=650; "src=" Http://s2.51cto.com/wyfs02/M01/84/61/wKiom1ePDxDA4WJtAAE2Z31VsPI509.png "style=" float: none; "title=" 11.PNG "alt=" Wkiom1epdxda4wjtaae2z31vspi509.png "/>
My script is simply the implementation of the above functions, the length of about 500 lines, various exception handling has not been added. If you are interested, you can contact me to see the full source code.
This article is from the "Mapo Tofu" blog, please be sure to keep this source http://beanxyz.blog.51cto.com/5570417/1828052
Powershell AWS Automation Management (12)-Create a highly available WordPress blog (bottom)