[アップデート] CodeDeploy Agent が Red Hat Enterprise Linux 9をサポートしました

CodeDeployを使いたいからという理由でRHEL 9を諦めなくても良くなった
2024.03.20

Red Hat Enterprise Linux 9のEC2インスタンスにCodeDeployを使ってアプリケーションをデプロイしたい

こんにちは、のんピ(@non____97)です。

皆さんはRed Hat Enterprise Linux 9(以降RHEL 9)のEC2インスタンスにCodeDeployを使ってアプリケーションをデプロイしたいなと思ったことはありますか? 私はあります。

RHEL 9のFull Life Application Streams Release Life CycleはRuby 3.0です。CodeDeploy Agent でのRuby 3.0のサポートは2023/3/3にリリースされた1.5.0からです。

しかし、CodeDeploy Agent 1.5.0や1.6.0がサポートしているOSにはRHEL 9は含まれていませんでした。

CodeDeploy Agentが使えないとなると、デプロイ処理が面倒です。CI/CDとの相性も悪いです。また、Auto Scalongをしている環境であってもゴールデンイメージを都度作り直すのも大変です。

ふと、CodeDeploy AgentのサポートOSを眺めていると、CodeDeploy Agent 1.7.0からRHEL 9がサポート対象に追加されていました。

これで「CodeDeploy Agentが使えないからRHEL 9を使うのを諦める」という悲しい事態にならなくなりました。

ちなみに、私が検証した限りではCodeDeploy Agent 1.6.0でも正常に動作していました。実際1.6.0と1.7.0のソースコードを比較してもRHEL 9特有の事象を回避するための変更はなさそうでした。

試してみた

検証環境

せっかくなので試してみます。

検証環境は以下のとおりです。

CodeDeploy Agent が Red Hat Enterprise Linux 9をサポートしました検証環境構成図

検証環境はAWS CDKでデプロイしました。使用したコードは以下リポジトリに保存しています。

CodeDeploy Agentはユーザーデータを使ってインストールしています。デプロイ後にユーザーデータのログを確認してみると、CodeDeploy Agent 1.7.0でインストールされていました。

$ cat /var/log/user-data.log
++ curl -s -X PUT -H 'X-aws-ec2-metadata-token-ttl-seconds: 21600' http://169.254.169.254/latest/api/token
+ token=AQAEAIVyWa8oGACiXv2spRuxwD062qBOoPuVTUZ-1-oBnU_EYaq0fw==
++ curl -s -H 'X-aws-ec2-metadata-token: AQAEAIVyWa8oGACiXv2spRuxwD062qBOoPuVTUZ-1-oBnU_EYaq0fw==' http://169.254.169.254/latest/meta-data/placement/availability-zone
++ sed -e 's/.$//'
+ region_name=us-east-1
+ dnf install -y https://s3.us-east-1.amazonaws.com/amazon-ssm-us-east-1/latest/linux_amd64/amazon-ssm-agent.rpm ruby httpd
Updating Subscription Management repositories.
Unable to read consumer identity

This system is not registered with an entitlement server. You can use subscription-manager to register.

Red Hat Enterprise Linux 9 for x86_64 - AppStre  18 MB/s |  30 MB     00:01
Red Hat Enterprise Linux 9 for x86_64 - BaseOS   12 MB/s |  19 MB     00:01
Red Hat Enterprise Linux 9 Client Configuration  29 kB/s | 2.2 kB     00:00
amazon-ssm-agent.rpm                             74 MB/s |  26 MB     00:00
Dependencies resolved.
================================================================================
 Package            Arch   Version             Repository                  Size
================================================================================
Installing:
 amazon-ssm-agent   x86_64 3.3.131.0-1         @commandline                26 M
 httpd              x86_64 2.4.57-5.el9        rhel-9-appstream-rhui-rpms  52 k
 ruby               x86_64 3.0.4-160.el9_0     rhel-9-appstream-rhui-rpms  45 k
Installing dependencies:
 apr                x86_64 1.7.0-12.el9_3      rhel-9-appstream-rhui-rpms 126 k
 apr-util           x86_64 1.6.1-23.el9        rhel-9-appstream-rhui-rpms  97 k
 apr-util-bdb       x86_64 1.6.1-23.el9        rhel-9-appstream-rhui-rpms  14 k
 httpd-core         x86_64 2.4.57-5.el9        rhel-9-appstream-rhui-rpms 1.5 M
 httpd-filesystem   noarch 2.4.57-5.el9        rhel-9-appstream-rhui-rpms  16 k
 httpd-tools        x86_64 2.4.57-5.el9        rhel-9-appstream-rhui-rpms  87 k
 mailcap            noarch 2.1.49-5.el9        rhel-9-baseos-rhui-rpms     35 k
 redhat-logos-httpd noarch 90.4-2.el9          rhel-9-appstream-rhui-rpms  18 k
 ruby-libs          x86_64 3.0.4-160.el9_0     rhel-9-appstream-rhui-rpms 3.3 M
 rubygem-json       x86_64 2.5.1-160.el9_0     rhel-9-appstream-rhui-rpms  63 k
 rubygem-psych      x86_64 3.3.2-160.el9_0     rhel-9-appstream-rhui-rpms  64 k
Installing weak dependencies:
 apr-util-openssl   x86_64 1.6.1-23.el9        rhel-9-appstream-rhui-rpms  17 k
 mod_http2          x86_64 1.15.19-5.el9       rhel-9-appstream-rhui-rpms 152 k
 mod_lua            x86_64 2.4.57-5.el9        rhel-9-appstream-rhui-rpms  62 k
 ruby-default-gems  noarch 3.0.4-160.el9_0     rhel-9-appstream-rhui-rpms  50 k
 rubygem-bigdecimal x86_64 3.0.0-160.el9_0     rhel-9-appstream-rhui-rpms  60 k
 rubygem-bundler    noarch 2.2.33-160.el9_0    rhel-9-appstream-rhui-rpms 460 k
 rubygem-io-console x86_64 0.5.7-160.el9_0     rhel-9-appstream-rhui-rpms  30 k
 rubygem-rdoc       noarch 6.3.3-160.el9_0     rhel-9-appstream-rhui-rpms 444 k
 rubygems           noarch 3.2.33-160.el9_0    rhel-9-appstream-rhui-rpms 310 k

Transaction Summary
================================================================================
Install  23 Packages

Total size: 32 M
Total download size: 7.0 M
Installed size: 130 M
Downloading Packages:
(1/22): ruby-3.0.4-160.el9_0.x86_64.rpm         615 kB/s |  45 kB     00:00
(2/22): ruby-default-gems-3.0.4-160.el9_0.noarc 616 kB/s |  50 kB     00:00
.
.
(中略)
.
.
Installed:
  amazon-ssm-agent-3.3.131.0-1.x86_64
  apr-1.7.0-12.el9_3.x86_64
  apr-util-1.6.1-23.el9.x86_64
  apr-util-bdb-1.6.1-23.el9.x86_64
  apr-util-openssl-1.6.1-23.el9.x86_64
  httpd-2.4.57-5.el9.x86_64
  httpd-core-2.4.57-5.el9.x86_64
  httpd-filesystem-2.4.57-5.el9.noarch
  httpd-tools-2.4.57-5.el9.x86_64
  mailcap-2.1.49-5.el9.noarch
  mod_http2-1.15.19-5.el9.x86_64
  mod_lua-2.4.57-5.el9.x86_64
  redhat-logos-httpd-90.4-2.el9.noarch
  ruby-3.0.4-160.el9_0.x86_64
  ruby-default-gems-3.0.4-160.el9_0.noarch
  ruby-libs-3.0.4-160.el9_0.x86_64
  rubygem-bigdecimal-3.0.0-160.el9_0.x86_64
  rubygem-bundler-2.2.33-160.el9_0.noarch
  rubygem-io-console-0.5.7-160.el9_0.x86_64
  rubygem-json-2.5.1-160.el9_0.x86_64
  rubygem-psych-3.3.2-160.el9_0.x86_64
  rubygem-rdoc-6.3.3-160.el9_0.noarch
  rubygems-3.2.33-160.el9_0.noarch

Complete!
+ cd /usr/src/
+ curl https://aws-codedeploy-us-east-1.s3.us-east-1.amazonaws.com/latest/install -o install
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 19045  100 19045    0     0   133k      0 --:--:-- --:--:-- --:--:--  133k
+ chmod +x ./install
+ ./install auto
+ systemctl status codedeploy-agent
● codedeploy-agent.service - AWS CodeDeploy Host Agent
     Loaded: loaded (/usr/lib/systemd/system/codedeploy-agent.service; enabled; preset: disabled)
     Active: active (running) since Wed 2024-03-20 08:37:35 UTC; 2s ago
   Main PID: 11623 (ruby)
      Tasks: 3 (limit: 4180)
     Memory: 62.2M
        CPU: 1.425s
     CGroup: /system.slice/codedeploy-agent.service
             ├─11623 "codedeploy-agent: master 11623"
             └─11633 "codedeploy-agent: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller of master 11623"

Mar 20 08:37:35 ip-10-10-0-24.ec2.internal systemd[1]: Starting AWS CodeDeploy Host Agent...
Mar 20 08:37:35 ip-10-10-0-24.ec2.internal systemd[1]: Started AWS CodeDeploy Host Agent.
+ cat /opt/codedeploy-agent/.version
agent_version: OFFICIAL_1.7.0-92_rpm+ systemctl enable amazon-ssm-agent --now
+ systemctl enable httpd --now
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

デプロイ後にALBのDNS名を使ってアクセスしてみます。

$ curl non-97-sandbox-alb-540065044.us-east-1.elb.amazonaws.com -I
HTTP/1.1 403 Forbidden
Date: Wed, 20 Mar 2024 08:44:55 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 5909
Connection: close
Server: Apache/2.4.57 (Red Hat Enterprise Linux)
Last-Modified: Mon, 09 Aug 2021 11:43:42 GMT
ETag: "1715-5c91ee59c9780"
Accept-Ranges: bytes

ドキュメントルート直下にはindex.htmlも何もないので、403となりました。

CodeDeployを使ったコンテンツ配布

それではCodeDeployを使ってコンテンツを配布します。

既にアプリケーションはCDKで作成しています。手動でデプロイを作成します。

デプロイの作成

リビジョンの場所にCodeDeployのサンプルアプリケーションであるs3://aws-codedeploy-us-east-1/samples/latest/SampleApp_Linux.zipを入力してデプロイの作成をクリックします。

Create deployment

デプロイが開始されました。デプロイ設定をOne At A Timeにしたので1台づつデプロイされていそうです。

デプロイ開始時

しばらくすると1台目のEC2インスタンスへのデプロイが完了しました。

1つのEC2インスタンスへのデプロイが完了したことを確認

もう一台のEC2インスタンスへのデプロイも開始していそうです。

もう一つのEC2インスタンスも開始していることを確認

そのまま4分ほど待つと、デプロイステータスが成功になりました。

デプロイが完了したことを確認

ALBのターゲットグループを確認すると、どちらもHealthyになっています。

ターゲットグループのヘルスチェックの状態

アクセスすると、確かにHTTPステータスコード200が返ってくるようになりました。

$ curl non-97-sandbox-alb-540065044.us-east-1.elb.amazonaws.com -I
HTTP/1.1 200 OK
Date: Wed, 20 Mar 2024 09:25:15 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 717
Connection: close
Server: Apache/2.4.57 (Red Hat Enterprise Linux)
Last-Modified: Wed, 20 Mar 2024 09:22:43 GMT
ETag: "2cd-61414220b6098"
Accept-Ranges: bytes

CodeDeploy Agentが出力されたログを確認してみます。

$ cat /opt/codedeploy-agent/deployment-root/deployment-logs/codedeploy-agent-deployments.log
# Logfile created on 2024-03-20 09:22:44 +0000 by logger.rb/v1.4.3
[2024-03-20 09:22:44.321] [d-XWH2NUY35]LifecycleEvent - BeforeInstall
[2024-03-20 09:22:44.322] [d-XWH2NUY35]Script - scripts/install_dependencies
[2024-03-20 09:22:45.303] [d-XWH2NUY35][stdout]Updating Subscription Management repositories.
[2024-03-20 09:22:45.303] [d-XWH2NUY35][stdout]Unable to read consumer identity
[2024-03-20 09:22:45.307] [d-XWH2NUY35][stdout]
[2024-03-20 09:22:45.307] [d-XWH2NUY35][stdout]This system is not registered with an entitlement server. You can use subscription-manager to register.
[2024-03-20 09:22:45.307] [d-XWH2NUY35][stdout]
[2024-03-20 09:22:45.551] [d-XWH2NUY35][stdout]Red Hat Enterprise Linux 9 for x86_64 - AppStre  62 kB/s | 4.5 kB     00:00
[2024-03-20 09:22:45.813] [d-XWH2NUY35][stdout]Red Hat Enterprise Linux 9 for x86_64 - BaseOS   79 kB/s | 4.1 kB     00:00
[2024-03-20 09:22:46.029] [d-XWH2NUY35][stdout]Red Hat Enterprise Linux 9 Client Configuration  31 kB/s | 1.5 kB     00:00
[2024-03-20 09:22:46.176] [d-XWH2NUY35][stdout]Package httpd-2.4.57-5.el9.x86_64 is already installed.
[2024-03-20 09:22:46.232] [d-XWH2NUY35][stdout]Dependencies resolved.
[2024-03-20 09:22:46.234] [d-XWH2NUY35][stdout]Nothing to do.
[2024-03-20 09:22:46.234] [d-XWH2NUY35][stdout]Complete!
[2024-03-20 09:22:46.378] [d-XWH2NUY35]Script - scripts/start_server
[2024-03-20 09:22:46.426] [d-XWH2NUY35][stderr]Redirecting to /bin/systemctl start httpd.service

問題なく動作していそうですね。

Auto ScalingしたEC2インスタンスに対してコンテンツ配布することを確認

せっかくなので、Auto ScalingしたEC2インスタンスに対してコンテンツ配布することを確認します。

Auto Scaling Group内のEC2インスタンスを停止させます。

EC2インスタンスの停止

すると、新しくEC2インスタンスが立ち上がってきました。

インスタンス管理

Auto Scalingのアクティビティにも記録されていました。

アクティビティ

デプロイ履歴を確認すると、Auto Scaling Groupによって起動したEC2インスタンスに新たにデプロイが走っていそうです。

デプロイが開始していることを確認

3分ほど待つとデプロイが完了しました。問題なく動作していますね。

新しいインスタンスのデプロイが完了したことを確認

CodeDeployを使いたいからという理由でRHEL 9の採用を諦めなくても良くなった

CodeDeploy Agent が Red Hat Enterprise Linux 9をサポートしたアップデートを紹介しました。

CodeDeployを使いたいからという理由でRHEL 9の採用を諦めなくても良くなりましたね。安心してRHEL 9を使えそうです。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!