職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

Ubuntu 22.04 にCodeDeployエージェントを入れる

この記事は、Ubuntu 22.04 で動かしているマシンに、AWSのCodeDeployのエージェントをインストールする手順等について述べた記事です。
※数日前にtweetしていた内容をブログ記事としてまとめて補足しただけの内容ですので、日頃から筆者のtweetを見られている方向けの新規の情報はそんなにありません。

AWS CodeDeploy とは?

非技術者向けの公式ページ曰く…

AWS CodeDeploy は、Amazon EC2AWS Fargate、AWS Lambda、オンプレミスで実行されるサーバーなど、さまざまなコンピューティングサービスへのソフトウェアのデプロイを自動化する、フルマネージド型のサービスです。AWS CodeDeploy を使用すると、新しい機能をすばやく簡単にリリースできます。また、アプリケーションのデプロイ時のダウンタイムを回避し、アプリケーションの複雑なアップデート処理にも対応します。さらに、ソフトウェアのデプロイを自動化できるため、ミスが起こりやすい手動操作の必要がなくなります。このサービスでは、デプロイのニーズに応じてスケールできます。

https://aws.amazon.com/jp/codedeploy/

です。詳細は技術者向けの公式ページを見て欲しいところですが、(EC2等がターゲットである場合は)ターゲットのマシンでagentを常駐させておき、CodeDeploy上でデプロイの指示を出すと、agentがそれに反応して動いて、デプロイのスクリプトを動かす…みたいな動きになります。

過去バージョンのUbuntuへの正式なインストール手順

公式ドキュメントの通りやれば、すんなりとインストールできます。少なくとも18.04と20.04は簡単だったような覚えがあります。

Ubuntu 22.04 での問題

CodeDeploy agent (またはそのインストーラ)は ruby 2.x に依存しているのですが、Ubuntu 22.04 の apt で普通にrubyをインストールしようとすると、3.x が入ります。ruby 3.x が入った状態で CodeDeploy agent のインストーラを動かすと、エラーになります。

具体的には、 Ubuntu 20.04 向けの手順として提示されている sudo ./install auto > /tmp/logfile を実行すると、stderrにもログファイルにも何も出力されないまま、終了ステータス 1 で即座に終了します。
古いUbuntu向けの手順である sudo ./install auto を実行すると、(stdoutなのかstderrなのかわかりませんが)以下のような内容が出力されて、やはり終了ステータス1で終了します。

I, [2022-10-02T07:01:40.954937 #2149]  INFO -- : Starting Ruby version check.
E, [2022-10-02T07:01:40.955082 #2149] ERROR -- : Current running Ruby version for root is 3.0.2, but Ruby version 2.x needs to be installed.
E, [2022-10-02T07:01:40.955108 #2149] ERROR -- : If you already have the proper Ruby version installed, please either create a symlink to /usr/bin/ruby2.x,
E, [2022-10-02T07:01:40.955130 #2149] ERROR -- : or run this install script with right interpreter. Otherwise please install Ruby 2.x for root user.
E, [2022-10-02T07:01:40.955150 #2149] ERROR -- : You can get more information by running the script with --help option.

まぁ、一言で言うと「Ruby 2.x 入れて」っていうメッセージなのですが…😇

この問題への対策としては、大きく分けて3通りのものが考えられます。

1. agent(またはそのインストーラ)が ruby 3.x に対応するのを待つ🍵
2. Ubuntu 22.04 に ruby 2.x を入れる
3. チェックをすり抜けて、無理矢理 ruby 3.x で動作するようにする

いつ 3.x 対応されるのか不明な状況で待つというのはつらいので、ここでは検討しないようにしましょう。
ruby 2.x をインストールする方法は、たとえば以下の記事に詳細な解説がありますので、そちらをご覧になると良いでしょう。
blog.noellabo.jp
ただし、こうやってインストールした ruby 2.x を以って CodeDeploy Agent がインストールできることの確認は取っておりません。

力技:チェックをすり抜ける

筆者はrubyに強い訳ではありませんが、ruby が 3.0 になるにあたって breaking change がそんなに多いという印象は無いので、チェックさえ誤魔化したら動くのでは?と思いました。もちろん、それで動かしたとしても動作保証は無いのですが😅

そしていろいろと検索していたところ、以下のような StackOverflow の質問および回答を見つけました。
stackoverflow.com
やっていることは、以下のようなことです。

  • 必要なものをaptでインストールして、
  • パッケージ(.debファイル)をダウンロードしてきて、
  • 解凍して、
  • メタデータに書かれている依存パッケージを ruby3.0 (aptでrubyを入れるときのパッケージ名称)に書き換えて、
  • パッケージを再度構築して、
  • インストールして、
  • 動作確認する

以下は、上記StackOverflowの回答に対する補足です。

必要なものをaptでインストール

元のコマンドでは ruby-webrick をインストールするように指定してありますが、さすがに不要だと思われます。もし必要だったとしても ruby-full を入れると一緒に入ります。
また、wgetも、Ubuntu 22.04 の標準的(?)なAMIから立てたEC2インスタンスでは最初から入っています。Ubuntuのインストール方法によっては明示的に入れる必要はありますけどね。

パッケージ(.debファイル)をダウンロード

wgethttps://aws-codedeploy-us-east-1.s3.us-east-1.amazonaws.com/releases/codedeploy-agent_1.3.2-1902_all.deb からダウンロードするようなコマンドになっていますが、このURLは、接続したいS3のリージョンや、ダウンロードしたいバージョンによって変化します。
正しいURLを構成する方法は、AWSの公式情報に書かれています。ドメイン部分ではリージョンを指定して、ファイル名部分ではバージョンを指定します。
この公式情報の通り、東京リージョンであれば、以下のコマンド(要・AWS CLI)を叩くことでバージョンの一覧を見ることができます。
aws s3 ls --recursive s3://aws-codedeploy-ap-northeast-1 --region ap-northeast-1

話は戻りますが、このStackOverflowで示された手順では、2021年5月にリリースされた 1.3.2 が指定されています。ちなみに本記事執筆時点での最新版は、この次のバージョンである、2022年9月にリリースされたばかりの 1.4.0 です。

この「チェックをすり抜ける」方法が将来のバージョンでも有効かどうかは不明なので、余計な時間を使いたくないのであれば、StackOverflowの回答に倣って 1.3.2 を入れておくのが無難かもしれません。

依存パッケージの書き換え

CodeDeploy agent 1.3.2 においては、元々は依存パッケージは以下のように書かれています。

Depends: ruby2.0 | ruby2.1 | ruby2.2 | ruby2.3 | ruby2.4 | ruby2.5 | ruby2.6 | ruby2.7

これを sed コマンドを用いて編集することによって Depends: ruby3.0 にしよう、という作戦ですね。

動作確認

StackOverflowの回答の手順では、動作確認で以下のコマンドが書かれています。

  • sudo systemctl list-units --type=service | grep codedeploy
  • sudo service codedeploy-agent status

でも、これらにsudoは不要でしょうね。。見るだけならroot権限は不要です。

さいごに

これで、Ubuntu 22.04 でも快適な CodeDeploy 生活を送ることができますね😃