Powershell AWS 自动化管理 (11) - 创建一个高可用的WordPress博客(中)

简介:

理论和基本架构在上一篇已经做了说明,这一篇直接来看看具体的脚本实现吧。首先来看看前面10个步骤的实现。


  1. 创建EC2-S3的Role,这个Role是分配给EC2虚拟机的,这样他们创建之后自动就有权限访问S3的内容。

  2. 创建VPC网络

  3. 创建VPC的2个子网,位于不同的AZ

  4. 创建Internet网关

  5. 配置路由表

  6. 创建并配置EC2的Security Group,确保80和22端口可用

  7. 创建高可用的MariaDB数据库

  8. 配置数据库的Security Group,确保3306端口可用

  9. 创建S3 Bucket 并配置Policy

  10. 创建CloudFront分布点,绑定S3 Bucket

  11. 准备WordPress的配置文档

  12. 准备Virtualhost的配置文档

  13. 上传配置文档到S3 Bucket中

  14. 配置Bash Shell脚本,包括LAMP,WordPress,AWS,Crontab和S3同步等等

  15. 创建EC2虚拟机,指定14步创建的BootStrap命令

  16. 更新DNS记录,指向该虚拟机

  17. 初始化WordPress界面

  18. 确认无误之后生成镜像文件

  19. 配置ELB

  20. 更新DNS记录到ELB的地址

  21. 配置Launch Configuration

  22. 配置Auto Scaling


0步, 首先我需要一个管理账号能登录到AWS

1
2
3
4
5
6
import-module  AWSPowerShell
get-module  AWSPowershell
#Create account from IAM, download user accesskey and secretkey
#Generate, list and delete profile
Set-AWSCredentials  -AccessKey AKIAJA11SDE5SXVHRQ -SecretKey Pc528Dw2/qwzOo4Pe421p2N618H+yFv1S7JVsBJ2M -StoreAs myprofile
Initialize-AWSDefaults -ProfileName myprofile -Region ap-southeast-2


1. 接下来创建一个EC2-S3的role


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 设置 Trust Relationship
$policy1 = @"
{
   "Version": "2012-10-17",
   "Statement": [
    
       {
       "Effect": "Allow",
       "Principal": {
         "Service": "ec2.amazonaws.com"
       },
       "Action": "sts:AssumeRole"
     }
     ]
}
"@
New-IAMRole  -RoleName  "EC2-S3"  -AssumeRolePolicyDocument  $policy1
 
#设置 S3的访问权限
$policy2  @"
{
"Version": "2012-10-17",
"Statement": [
     {
     "Effect": "Allow",
     "Action": "s3:*",
     "Resource": "*"
     }
]
}
"@
   
  Write-IAMRolePolicy  -PolicyDocument  $policy2  -RoleName  "EC2-S3"  -PolicyName  "allows3"

wKiom1eNxeaCVX1AAACBhwgfZ6E379.png



2. 创建VPC

1
2
3
#创建一个新的VPC
 
New-EC2Vpc  -CidrBlock 10.2.0.0/16


3. 创建VPC下的子网


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#创建两个子网,位于不同AZ
 
$vpcid = get-ec2vpc  Where-Object  { $_ .Cidrblock  -eq  "10.2.0.0/16" } | select -ExpandProperty vpcid
New-EC2Subnet  -CidrBlock 10.2.1.0/24 -VpcId  $vpcid  -AvailabilityZone ap-southeast-2a 
New-EC2Subnet  -CidrBlock 10.2.2.0/24 -VpcId  $vpcid  -AvailabilityZone ap-southeast-2b
Edit-EC2SubnetAttribute -SubnetId subid1 -MapPublicIpOnLaunch  $true
Edit-EC2SubnetAttribute -SubnetId sbuid2 -MapPublicIpOnLaunch  $true
$subid1 = Get-EC2Subnet  Where-Object { $_ .CidrBlock  -eq  "10.2.1.0/24" } | select -ExpandProperty SubnetId
 
#添加tag注释
$tag = new-object  Amazon.EC2.Model.Tag -Property @{key= "Name" ;value= "Sydney" }
New-EC2Tag  -Resource  $subid1  -Tag  $tag
$subid2 = Get-EC2Subnet  Where-Object { $_ .CidrBlock  -eq  "10.2.2.0/24" } | select -ExpandProperty SubnetId
$tag2 = new-object  Amazon.EC2.Model.Tag -Property @{key= "Name" ;value= "Melbourne" }
New-EC2Tag  -Resource  $subid2  -Tag  $tag2
 
#允许自动匹配公网IP
Edit-EC2SubnetAttribute -SubnetId  $subid1  -MapPublicIpOnLaunch  $true
Edit-EC2SubnetAttribute -SubnetId  $subid2  -MapPublicIpOnLaunch  $true

wKiom1eNxs3iDyVLAABgQUuzT6c209.png


4. 创建网关

1
2
3
4
5
6
7
8
#创建Internet网关
if (( Get-EC2InternetGateway  Where-Object  { $_ .Attachments[0]  -eq  $null } | measure).count  -eq  0){
     New-EC2InternetGateway 
}
$igwid = Get-EC2InternetGateway  Where-Object  { $_ .Attachments[0]  -eq  $null } | select -ExpandProperty internetGateWayId
$tagigw = new-object  Amazon.EC2.Model.Tag -Property @{key= "Name" ;value= "AU" }
new-EC2tag  -Resource  $igwid  -Tag  $tagigw
Get-EC2InternetGateway  $igwid |Add -EC2InternetGateway -VpcId  $vpcid


wKioL1eNxs_gpyXGAABSnjfeF1w946.png



5. 配置VPC的路由表


1
2
3
4
5
6
#配置路由表
#RouteTable
#New-EC2RouteTable -VpcId $vpcid 
$routetable = Get-EC2RouteTable  Where-Object  { $_ .VpcId  -eq  $vpcid }
#Add new Route
New-EC2Route  -DestinationCidrBlock  "0.0.0.0/0"  -GatewayId  $igwid  -RouteTableId  $routetable .RouteTabl


wKiom1eNxtKRajALAAA7s9JX1Pk870.png


6. 配置一个EC2的安全组,开放22和80端口,这样用户可以远程管理和访问博客

1
2
3
4
5
6
7
8
9
10
11
12
13
#6.配置SecurityGroup和端口 SSH,HTTP,MySql
New-EC2SecurityGroup  -GroupName WordPress -Description  "WordPress Security Group"  -VpcId  $vpcid
$ip1 = new-object  Amazon.EC2.Model.IpPermission
$ip1 .IpProtocol= "tcp"
$ip1 .FromPort=22
$ip1 .ToPort= "22"
$ip1 .IpRange= "0.0.0.0/0"
$ip2 = New-Object  Amazon.EC2.Model.IpPermission
$ip2 .IpProtocol= "tcp"
$ip2 .FromPort=80
$ip2 .ToPort=80
$ip2 .IpRange.Add( "0.0.0.0/0" )
Get-EC2SecurityGroup  Where-Object  { $_ .GroupName  -eq  "WordPress" } | Grant-EC2SecurityGroupIngress -IpPermission @( $ip1 , $ip2 )


wKiom1eNyJ3C0nS8AABDrjNXAGA253.png


7. 然后创建一个高可用的MariaDB,为了简单起见,数据库名字,用户名,密码都设为wordpress,注意我这里专门记录了这个数据库实例的ID号码,这个是为了后面配置WordPress需要的。


1
2
3
4
5
6
#创建RDS MultipleAZ
New-RDSDBInstance  -AllocatedStorage 5 -DBInstanceIdentifier  "wordpress"  -MasterUsername  "wordpress"  -MasterUserPassword  "wordpress"  `
  -AutoMinorVersionUpgrade  $true  -CopyTagsToSnapshot  $false  -DBInstanceClass  "db.t2.micro"  `
  -DBName  "wordpress"  -Engine  "mariadb"  -MultiAZ  $true
   
$rdssgid =( Get-RDSDBInstance  -DBInstanceIdentifier  "wordpress"  | select -ExpandProperty vpcSecurityGroups).vpcsecuritygroupid


因为创建比较花时间,大概有个10分钟左右,所以写了个循环不断检查是否创建完毕。

1
2
3
4
5
6
7
8
$status = Get-RDSDBInstance  -DBInstanceIdentifier  "wordpress"  | select -ExpandProperty DBInstanceStatus
write-host  "Initializing Mariad DB, Please wait..."  -NoNewline
while  ( $status  -ne  "available" ){
write-host  "."  -NoNewline
Start-Sleep  -Seconds 1
$status = Get-RDSDBInstance  -DBInstanceIdentifier  "wordpress"  | select -ExpandProperty DBInstanceStatus
}
write-host  "RDS is Ready"


wKioL1eNyKCTq2GsAADGKRpAy2c819.png


8.  然后为了确保他能够被我的WordPress 服务器访问,我还得打开3306端口

1
2
3
4
5
6
7
#Configure Security Group of DB
$ip3 = New-Object  Amazon.EC2.Model.IpPermission
$ip3 .IpProtocol= "tcp"
$ip3 .FromPort=3306
$ip3 .ToPort=3306
$ip3 .IpRange.Add( "0.0.0.0/0" )
Get-EC2SecurityGroup  Where-Object { $_ .GroupId  -eq  $rdssgid } | Grant-EC2SecurityGroupIngress -IpPermission @( $ip3 )


9.  接下来配置S3 Bucket和相关的Policy,这个Bucket的目的有2个,第一个是为了所有的EC2实例有一样的WordPress和Vhosts的配置文件;第二个是为了和EC2实例的本地目录同步保存所有的图片,类似的功能WordPress有很多插件可以做到,不过这里用脚本实现了


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#创建S3 Bucket
 
New-S3Bucket  -BucketName yuanliwordpress -Region ap-southeast-2
Get-S3Bucket  -BucketName yuanliwordpress
 
#允许该Bucket里面的uploads文件夹具有公共可读的权限,这个文件夹后面会用来保存WordPress里面的图片
 
$policy3 = @"
{
   "Version": "2012-10-17",
   "Statement": [
     {
       "Sid": "AddPem",
       "Action": [
         "s3:GetObject"
       ],
       "Effect": "Allow",
       "Resource": "arn:aws:s3:::yuanliwordpress/uploads/*",
       "Principal": "*"
     }
   ]
}
"@
Write-S3BucketPolicy  -BucketName yuanliwordpress -Policy  $policy3
Get-S3BucketPolicy  -BucketName yuanliwordpress


wKiom1eNyzWyBI0iAABXA16--Q4085.png



10. 然后给这个S3创建一个CDN的分布点,这样子从全球任何区域访问我的博客 速度都会很快了。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#配置S3和CloudFront
$origin  New-Object  Amazon.CloudFront.Model.Origin
$origin .DomainName= "yuanliwordpress.s3.amazonaws.com"
$origin .id= "S3-yuanliwordpress"
$origin .S3OriginConfig =  New-Object  Amazon.CloudFront.Model.S3OriginConfig
$origin .S3OriginConfig.OriginAccessIdentity = " "
$cfd=New-CFDistribution `
       -DistributionConfig_Enabled $true `
       -DistributionConfig_Comment " Test distribution " `
       -Origins_Item $origin `
       -Origins_Quantity 1 `
       -DistributionConfig_CallerReference wordpresstest `
       -DefaultCacheBehavior_TargetOriginId $origin.Id `
       -ForwardedValues_QueryString $true `
       -Cookies_Forward all `
       -WhitelistedNames_Quantity 0 `
       -TrustedSigners_Enabled $false `
       -TrustedSigners_Quantity 0 `
       -DefaultCacheBehavior_ViewerProtocolPolicy allow-all `
       -DefaultCacheBehavior_MinTTL 1000 `
       -DistributionConfig_PriceClass " PriceClass_All" `
       -CacheBehaviors_Quantity 0 `
       -Aliases_Quantity 0


wKioL1eNyw3Ap-mJAADCdHrVpJk799.png





本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1827752,如需转载请自行联系原作者

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云专有网络VPC使用教程
专有网络VPC可以帮助您基于阿里云构建出一个隔离的网络环境,并可以自定义IP 地址范围、网段、路由表和网关等;此外,也可以通过专线/VPN/GRE等连接方式实现云上VPC与传统IDC的互联,构建混合云业务。 产品详情:https://www.aliyun.com/product/vpc
目录
相关文章
|
4月前
【wordpress教程】wordpress博客网站添加非法关键词拦截
有的网站经常被恶意搜索,站长们不胜其烦。那我们如何屏蔽恶意搜索关键词呢?下面就随小编一起来解决这个问题吧。
73 1
|
5月前
|
移动开发 前端开发 语音技术
WordPress轻拟物博客主题niRvana 4.5.3(自适应手机端)
WordPress轻拟物主题niRvana,设计上不再趋从于现有的扁平风,我认为是时候从极致的扁平稍微向拟物致敬了,因此采用了轻拟物的风格。niRvana 设计和样式更加新颖,一眼看上去就会被他吸引住,主题配色也非常舒服。而且它有两个功能特别有意思,一个是自动根据文章特色图片识别出图片的主色调,在首页、文章分类页用最美的方式显示滚动图片,另一个则是文章支持语音朗读。主题细腻有质感,手机端体验非常好。
86 2
|
22天前
|
域名解析 弹性计算 程序员
想要轻松地搭建一个即开即用的WordPress博客吗?借助宝塔面板镜像+阿里云ECS,迅速拥有自己的个人博客
拥有个人博客是每位程序员的梦想,但对服务器不熟悉的初学者而言,搭建博客颇具挑战。本文介绍利用阿里云市场的宝塔面板镜像与ECS云服务器,轻松搭建WordPress博客的方法,让您快速拥有专属博客空间。通过简单的操作步骤,即使是新手也能轻松上手,实现从零到有的博客搭建过程。
110 3
|
16天前
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
17 0
|
6月前
|
PHP
菊子曰备份Wordpress网站的博客内容出错的解决办法(原创)
菊子曰备份Wordpress网站的博客内容出错的解决办法(原创)
525 2
|
6月前
|
Java Android开发
java利用xml-rpc协议操作wordpress博客
java利用xml-rpc协议操作wordpress博客
82 1
|
2月前
|
PHP SEO
WordPress博客每日定时发布 每天60秒读懂世界源码
WordPress博客每日定时发布 每天60秒读懂世界源码
51 0
WordPress博客每日定时发布 每天60秒读懂世界源码
|
5月前
|
存储 SQL 运维
使用PowerShell进行自动化脚本编写:入门与实战
【6月更文挑战第6天】本文介绍了PowerShell作为Windows系统管理的自动化工具,用于提升效率和减少错误。内容涵盖PowerShell基础,如变量、命令执行、管道、条件和循环语句、函数。实战案例展示了如何用PowerShell脚本进行文件备份。此外,还提及PowerShell的进阶功能,如模块、远程管理和与其他工具集成。学习和应用PowerShell能有效提升IT运维自动化水平。
|
30天前
|
机器学习/深度学习 人工智能 运维
构建高效运维体系:从自动化到智能化的演进
本文探讨了如何通过自动化和智能化手段,提升IT运维效率与质量。首先介绍了自动化在简化操作、减少错误中的作用;然后阐述了智能化技术如AI在预测故障、优化资源中的应用;最后讨论了如何构建一个既自动化又智能的运维体系,以实现高效、稳定和安全的IT环境。
54 4
|
22天前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
44 4