介绍
我们通过在EC2上设置Auto Scaling并引入Cl/CD(GitHub + CodePipeline + CodeDeploy + AMI自动更新)实现了自动化部署,下面总结一下流程。
此外,在 CodeDeploy 之后,我们创建了 最新のソースを反映したEC2のAMIを作成し、Auto Scaling の起動テンプレートにAMIを反映するLambda 并将其添加到 Codepipeline 阶段以自动化 AMI 的反射。
施工图
预建
- 网络层创建,例如vpc和subnet
- EC2 或 elb 可能会创建,也可能不会。
- 这一次,为了更容易理解,我们将制作一个简单的服务器,将 Nginx 放在 EC2 上。
- 已经创建的 EC2 没问题。它不一定是 nginx。
- 这一次,为了更容易理解,我们将制作一个简单的服务器,将 Nginx 放在 EC2 上。
安装 EC2 nginx
// ssh接続
% ssh -i xxxx.pem ec2-user@パブリックIP(またはDNS)
// nginxをインストール
$ sudo amazon-linux-extras install nginx1
// nginxを起動
$ sudo systemctl start nginx
// 自動起動設定
$ sudo systemctl enable nginx
$ cd /usr/share/nginx/html
$ ls
404.html 50x.html icons index.html nginx-logo.png poweredby.png
当您从具有 EC2 的公共 IP 的浏览器访问该网站时,您可以看到该网站。
创建 IAM 角色
创建两个 IAM 角色,一个用于附加到 CodeDeploy,一个用于附加到 EC2。
创建要在创建 CodeDeploy 时使用的 IAM 角色
-
常见用例:
CodeDeploy -
要附加的 AWS 托管策略
-
AWSCodeDeployRole
-
创建 CodeDeploy 时选择此角色。
创建一个 IAM 角色以附加到 EC2
- 常见用例:
EC2 - 要附加的 AWS 托管策略
AmazonS3FullAccess-
AWSCodeDeployRole
使用 Codepipeline 将日志上传到 S3 时需要AmazonS3FullAccess,因此请将其附加到 EC2。
创建 IAM 角色后,让我们将其附加到 EC2。
在 EC2 上安装 CodeDeploy 代理并创建 AMI
请参考以下文章在 EC2 上安装 CodeDeploy 代理。
$ cd
$ sudo yum install -y ruby
$ sudo yum install -y wget
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
パッケージ wget-1.14-18.amzn2.1.x86_64 はインストール済みか最新バージョンです
何もしません
$ wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install
$ chmod +x ./install
$ sudo ./install auto
$ sudo service codedeploy-agent status
The AWS CodeDeploy agent is running as PID 3246
sudo service codedeploy-agent status
对于以下命令,URL 适用于 EC2 位于东京地区时的情况。
-
wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install
请参阅此处以获取该地区的 URL
创建启动模板
在创建启动模板之前,请使用安装了 Nginx 的 EC2 AMI。
创建启动模板。
-
描述启动模板名称和模板版本
对于 AMI,指定您之前创建的 AMI。 -
指定实例类型和密钥对。
-
为子网选择
起動テンプレートの設定に含めない。 -
选择现有的安全组。
-
添加网络接口。
-
@987654363
有効化这是为了检查在 CodeDeploy 之后是否反映了源。其他保留为默认值。
-
@987654363
-
对于存储,保留默认值,因为它应该是 AMI 的 EBS。
-
高度の詳細からIAM 角色选择附加到 EC2 的角色。其他保留为默认值。
保留其他默认值并创建启动模板。
创建 Auto Scaling 组
- Auto Scaling 组名:
nginx - 启动模板:
nginx - 版本:
Latest- 确保使用最新,而不是默认值。它现在将反映最新版本的启动模板。
- 确保使用最新,而不是默认值。它现在将反映最新版本的启动模板。
- 选择 VPC 和子网。
- 如果您尚未创建负载平衡器和目标组,请立即创建。
- 健康检查类型不检查
ELB。
启动 AutoScaling 而不检查一次。只有成功了才可以检查。- 为负载平衡器方案选择
internet-facing。internal(内部)不好。 - 对于子网,选择一个公共子网。
- 为负载平衡器方案选择
- 组大小和扩展策略是任意决定的。
- 这一次,当 CPU 超过 50% 时,实例数会增加。
- 这一次,当 CPU 超过 50% 时,实例数会增加。
- 这次没有通知。
它也没有添加
- 标记。
这应该启动一个实例。
从具有 elb 的 DNS 名称的浏览器 (nginx-elb-account-id.ap-northeast-1.elb.amazonaws.com)
让我们检查一下我们访问时是否显示了nginx默认值。
如果您在浏览器中看不到它,请检查您的 EC2 和 ELB 安全组。
目标群体修改
默认目标组中登録解除の遅延是300秒,影响CodeDeploy速度,所以改成10秒。
此外,出于同样的原因,健康检查正常と非正常のしきい値 从 5 次变为最少 2 次。
这使得 CodeDeploy 期间的部署速度更快。
我用这篇文章作为参考。
在负载下检查 Auto Scaling 的运行情况
这是一个验证过程,因此您可以跳过它。
将 Auto Scaling 组大小的最大容量设置为 3,
使用 yes 命令应用负载后,让我们检查 EC2 实例的数量是否为 3。
准备两个终端选项卡,并将两个选项卡通过 SSH 连接到 EC2。
一个运行以下命令:
$ yes dev/null &
确认 EC2 实例数为 3 后,让我们用 kill 命令停止另一个终端。
$顶部
// yesコマンドのPIDを確認します。
$杀
その後、EC2がスケールインし、EC2インスタンスが1になっているか確認します。
# GitHubにappspec.ymlをアップ
元々Githubのリポジトリにあるものは、index.htmlのみです。
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<body>
<p>CodeDeploy success!!</p>
</body>
</html>
将appspec.yml 添加到此存储库。appspec.yml 将是 CodeDeploy 说明。
这一次,我会写以下内容。
version: 0.0
os: linux
files:
- source: /
destination: /usr/share/nginx/html
file_exists_behavior: OVERWRITE
permissions:
- object: /usr/share/nginx/html
pattern: '**'
owner: ec2-user
group: nginx
mode: 644
type:
- file
- object: /usr/share/nginx/html
pattern: '**'
owner: ec2-user
group: nginx
mode: 755
type:
- directory
比如EC2上的Laravel + apache,appspec.yml如下。
version: 0.0
os: linux
files:
- source: /
destination: /usr/share/nginx/html
file_exists_behavior: OVERWRITE
permissions:
- object: /usr/share/nginx/html
pattern: "**"
owner: ec2-user
group: apache
except: [/usr/share/nginx/html/storage]
type:
- file
mode: 644
- object: /usr/share/nginx/html
pattern: "**"
owner: ec2-user
group: apache
except: [/usr/share/nginx/html/storage]
type:
- directory
ode: 755
- object: /usr/share/nginx/html/storage
pattern: "**"
owner: ec2-user
group: apache
type:
- file
mode: 775
- object: /usr/share/nginx/html/storage
pattern: "**"
owner: ec2-user
group: apache
type:
- directory
mode: 775
-
source指定要部署的存储库的路径。 -
destination指定将修订版(GitHub 源)部署到服务器时的服务器路径。 -
file_exists_behavior: OVERWRITE覆盖您部署到的源。
如果部署目标是 EC2,您可能希望将 CodeDeploy 的修订目标设为在部署修订之前就已存在的文件。但是,如果您保持原样,部署将失败并显示“已经存在”的错误,但此描述将覆盖它并避免错误。
详情请看这篇文章
上传 appspec.yml 后,GitHub 仓库会有如下配置。很简单,不是吗?
配置 CodeDeploy
应用程序创建
单击为 CodeDeploy 创建应用程序。
填写应用名称并选择 EC2 作为平台。
创建部署组
- 部署组名称:
nginx - 服务角色:
CodeDeployRole(在 IAM 角色创建中创建的角色。) - 部署类型:
インプレース - 首选项:检查
Amazon EC2 Auto Scaling グループ并选择nignx - 部署设置:
CodeDeployDefault.OneAtTime- 一一部署到EC2。
- 检查负载均衡器:
ロードバランシングを有効にする- 同时选择一个目标组。
- 同时选择一个目标组。
创建部署
- 部署组:
先程作成したデプロイグループ名 - 修订类型:
Github- 对于 GitHub 令牌名称,输入适当的名称并单击
Githubに接続。 -
点击
Authorize aws-codesuite -
点击
確認。 - 连接完成后,系统将提示您输入存储库和提交 ID。
- 存储库名称是
Githubのアカウント名 / リポジトリ名。
- 存储库名称是
- 检查其他部署行为设置:
コンテンツの上書き。
- 对于 GitHub 令牌名称,输入适当的名称并单击
成功部署后,尝试 SSH 连接到 EC2。
$ cd /usr/share/nginx/html
//デプロイ前
$ ls -la
-rw-r--r-- 1 root root 3665 7月 12 01:09 404.html
-rw-r--r-- 1 root root 3708 7月 12 01:09 50x.html
drwxr-xr-x 2 root root 27 8月 24 15:20 icons
-rw-r--r-- 1 root root 3520 7月 12 01:09 index.html
-rw-r--r-- 1 root root 368 7月 12 01:09 nginx-logo.png
lrwxrwxrwx 1 root root 14 8月 24 15:20 poweredby.png -> nginx-logo.png
//デプロイ後
$ ls -la
-rw-r--r-- 1 root root 3665 7月 12 01:09 404.html
-rw-r--r-- 1 root root 3708 7月 12 01:09 50x.html
-rw-r--r-- 1 ec2-user nginx 353 8月 25 14:09 appspec.yml
drwxr-xr-x 2 root root 27 8月 24 15:20 icons
-rw-r--r-- 1 ec2-user nginx 168 8月 25 14:09 index.html
-rw-r--r-- 1 root root 368 7月 12 01:09 nginx-logo.png
lrwxrwxrwx 1 root root 14 8月 24 15:20 poweredby.png -> nginx-logo.png
可以看到index.html已经反映,appspec.yml已经添加。
从具有 elb 的 DNS 名称的浏览器 (nginx-elb-account-id.ap-northeast-1.elb.amazonaws.com)
当你访问它时,它不再是 nginx 默认值,并且 index.html 被反映。
如果您在浏览器中看不到它,请检查您的 EC2 和 ELB 安全组。
CodePipelineを作成 将是下一次,因为它越来越长。
参考文章
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308624595.html