手把手教你用亚马逊云科技搭建 Sphinx 文档服务器:从零构建自动化部署流水线
这个项目虽然基础,但涵盖了完整的CI/CD流程,特别适合想要入门亚马逊云科技自动化部署的小伙伴们。有了权限基础,现在我们可以创建文档服务器了。当然,在生产环境中,你可能需要考虑滚动部署或蓝绿部署来减少停机时间,但对我们这个简单项目来说,一次性部署就足够了。而且我们这个配置是最小化的,你完全可以在此基础上扩展,比如加入CodePipeline来编排整个流程,或者添加测试阶段等。在“存储桶名称”字段输
新用户可获得高达 200 美元的服务抵扣金
亚马逊云科技新用户可以免费使用亚马逊云科技免费套餐(Amazon Free Tier)。注册即可获得 100 美元的服务抵扣金,在探索关键亚马逊云科技服务时可以再额外获得最多 100 美元的服务抵扣金。使用免费计划试用亚马逊云科技服务,最长可达 6 个月,无需支付任何费用,除非您选择付费计划。付费计划允许您扩展运营并获得超过 150 项亚马逊云科技服务的访问权限。
大家好!作为一名移动开发工程师,我最近在工作中接触到了亚马逊云服务的持续集成与部署服务。今天想和大家分享一个实战项目——如何使用CodeBuild和CodeDeploy搭建一个简单的Sphinx文档Web服务器。这个项目虽然基础,但涵盖了完整的CI/CD流程,特别适合想要入门亚马逊云科技自动化部署的小伙伴们。
项目背景与目标
记得刚开始接触亚马逊云服务的部署流水线时,那些错综复杂的服务让我一头雾水。CodeBuild、CodeDeploy、IAM角色、安全组...每个名词都像是一道坎。经过反复尝试和无数次的错误调试,我终于搭建成功了这个简单的Web服务器。现在把完整过程分享出来,希望能帮助到和我当初一样困惑的朋友们。
我们这个项目要实现的是:当开发者将Sphinx文档代码推送到GitHub仓库后,系统会自动构建文档并部署到EC2服务器上。整个过程完全自动化,无需人工干预。
环境准备
在开始之前,我们需要准备好基础环境。首先,把示例代码仓库Fork到你自己的GitHub账号下。这个仓库里已经配置好了buildspec.yml文件,它告诉CodeBuild如何构建我们的Sphinx文档。
接下来是最重要的部分——配置亚马逊云科技的各项服务。我建议按照以下顺序来操作,这样可以避免很多权限上的坑。
第一步:存储桶与权限配置
存储是自动化部署的基础。我们先在Amazon S3中创建一个存储桶,用来存放构建产物。先在控制台搜索"S3"。
点击屏幕中央的“创建存储桶”按钮。
在“存储桶名称”字段输入自定义名称点击"创建存储桶"按钮,给你的存储桶起个有意义的名字,比如"sphinx-docs-2023"。记住,存储桶名称必须全局唯一!之后滚动至页面底部,点击 “创建存储桶” 按钮
确认新创建的存储桶已显示在列表中。
创建完存储桶后,我们需要配置各种IAM角色和策略。这部分可能会让很多新手头疼,但别担心,跟着我做就不会出错。首先在亚马逊云科技控制台顶部的搜索框中查找IAM。
在左侧导航栏点击"策略(Policies)",在页面右侧点击"创建策略(Create policy)"按钮。
之后创建几个关键策略,我把完整的策略JSON都放在了文章中,你可以直接复制使用。Amazon CodePipelineServiceRole策略需要包含对S3、CodeBuild和CodeDeploy的基本操作权限。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketAcl",
"s3:GetBucketLocation",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::your-codepipeline-artifacts-bucket",
"arn:aws:s3:::your-codepipeline-artifacts-bucket/*"
]
},
{
"Effect": "Allow",
"Action": [
"codebuild:BatchGetBuilds",
"codebuild:StartBuild"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"codedeploy:CreateDeployment",
"codedeploy:GetApplication",
"codedeploy:GetApplicationRevision",
"codedeploy:GetDeployment",
"codedeploy:GetDeploymentConfig",
"codedeploy:RegisterApplicationRevision"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"codestar-connections:UseConnection"
],
"Resource": "*"
}
]
}
Amazon CodeBuildServiceRole策略则需要日志记录和S3访问权限。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Resource": "*",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::your-codepipeline-artifacts-bucket",
"arn:aws:s3:::your-codepipeline-artifacts-bucket/*"
]
}
]
}
创建完策略后,我们还需要四个关键角色。先来创建 EC2InstanceRole
接下来是Amazon CodePipelineServiceRole。
然后是Amazon CodeBuildServiceRole。
最后是Amazon CodeDeployServiceRole。
创建角色时要选择正确的服务主体,比如CodeBuild角色要选择"CodeBuild"作为受信任的实体。
第二步:搭建文档服务器
有了权限基础,现在我们可以创建文档服务器了。选择RHEL10系统的 EC2实例,在创建之前,记得先配置好安全组。我建议开放SSH(22端口)和HTTP(80端口),但SSH最好限制为你的IP地址,这样更安全。先在搜索框搜索"EC2"。
之后在左侧面板点击 "Security Groups",并点击右侧 "Create security group" 按钮
在安全组创建界面填写任意值,其他配置保持默认。
实例启动后,通过Terminal或Putty连接上去,我们需要安装一些基础软件:Ruby、Web服务器(HTTPD)和CodeDeploy代理。这些命令我都已经整理好了,你只需要逐行执行即可。
sudo yum update -y
sudo yum install -y ruby wget httpd
cd /home/ec2-user
wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/codedeploy-agent.noarch.rpm
sudo yum install -y ./codedeploy-agent.noarch.rpm
sudo systemctl start codedeploy-agent
sudo systemctl status codedeploy-agent
sudo systemctl start httpd
sudo systemctl enable httpd
sudo systemctl status httpd
安装完成后,别忘了把之前创建的 EC2InstanceRole 附加到这个实例上,这样它才有权限从 S3 获取构建产物。
第三步:配置自动化构建
现在来到最精彩的部分——配置 CodeBuild。在控制台创建一个新的构建项目,源代码选择我们Fork的GitHub仓库。
环境镜像选择 Amazon Linux 2标准镜像即可。关键是要正确配置构建规范,我们的 buildspec.yml 已经定义好了所有构建步骤:安装Sphinx、生成HTML文档、将产物上传到S3。
这里有个小技巧:你可以在构建环境中添加环境变量,比如文档版本号,这样每次构建都能生成独特的版本标识。构建成功后,所有生成的HTML文件会自动上传到我们之前创建的S3存储桶中。
第四步:自动化部署配置
构建完成后,就该CodeDeploy登场了。首先创建一个新的应用程序,类型选择"EC2/本地"。
然后创建部署组,选择我们刚刚配置的 EC2 实例作为部署目标。这里要注意的是,部署组必须使用我们之前创建的 Amaozn CodeDeployServiceRole。
在部署配置中,我建议选择"CodeDeployDefault.AllAtOnce",这样部署会一次性完成。当然,在生产环境中,你可能需要考虑滚动部署或蓝绿部署来减少停机时间,但对我们这个简单项目来说,一次性部署就足够了。执行效果如下。
调试与问题解决
在实际操作中,你可能会遇到一些权限问题,就像我当初一样。最常见的两个问题是:
第一个是CodePipeline服务角色权限不足。解决方法是为 Amazon CodePipelineServiceRole添加额外的S3权限,包括GetBucketVersioning等操作。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketAcl",
"s3:GetBucketLocation",
"s3:GetBucketVersioning",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::codepipeline-ap-northeast-1-71a30834a9be-4ec0-a2b9-981224e19677",
"arn:aws:s3:::codepipeline-ap-northeast-1-71a30834a9be-4ec0-a2b9-981224e19677/*"
]
}
]
}
第二个是EC2实例权限不足。这时我们需要为EC2InstanceRole添加内联策略,允许它从S3获取对象、与CodeDeploy交互以及查询EC2实例状态
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::sphinx-handson-20250526",
"arn:aws:s3:::sphinx-handson-20250526/*"
]
},
{
"Effect": "Allow",
"Action": [
"codedeploy:CreateDeployment",
"codedeploy:GetApplication",
"codedeploy:GetDeployment",
"codedeploy:GetDeploymentConfig",
"codedeploy:ListApplications",
"codedeploy:ListDeployments"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ec2:DescribeInstanceStatus"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"tag:GetResources"
],
"Resource": "*"
}
]
}
遇到错误时,首先要检查CloudTrail日志,看看是哪个操作被拒绝了,然后有针对性地补充权限。重新执行后,所有错误均已解决。
成果验证与总结
经过一番调试后,重新执行整个流程。当看到部署成功的消息时,那种成就感真是无法形容!现在,你可以通过EC2的公有IP地址访问到自动构建部署的Sphinx文档网站了。
回顾整个过程,虽然CodeDeploy的错误调试花了我不少时间,但熟悉后就会发现这套流程其实非常高效。而且我们这个配置是最小化的,你完全可以在此基础上扩展,比如加入CodePipeline来编排整个流程,或者添加测试阶段等。
最后,我仍然觉得自己在部署流水线方面有很多需要学习的地方。比如如何实现蓝绿部署、如何加入自动化测试等。如果你也对这方面感兴趣,欢迎一起交流探讨。记住,每个专家都是从新手开始的,重要的是保持学习和实践的热情!希望这篇分享能帮助你顺利搭建起自己的自动化文档服务器。如果在操作过程中遇到任何问题,欢迎在评论区留言,我会尽力解答。
以上就是本文的全部内容啦。最后提醒一下各位工友,如果后续不再使用相关服务,别忘了在控制台关闭,避免超出免费额度产生费用~

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。
更多推荐
所有评论(0)