新用户可获得高达 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来编排整个流程,或者添加测试阶段等。

最后,我仍然觉得自己在部署流水线方面有很多需要学习的地方。比如如何实现蓝绿部署、如何加入自动化测试等。如果你也对这方面感兴趣,欢迎一起交流探讨。记住,每个专家都是从新手开始的,重要的是保持学习和实践的热情!希望这篇分享能帮助你顺利搭建起自己的自动化文档服务器。如果在操作过程中遇到任何问题,欢迎在评论区留言,我会尽力解答。

以上就是本文的全部内容啦。最后提醒一下各位工友,如果后续不再使用相关服务,别忘了在控制台关闭,避免超出免费额度产生费用~

Logo

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

更多推荐