インターネット上のリポジトリにアクセスできないローカルな環境でdnf/yumによるパッケージをインストールしたい時やパッケージのバージョンを管理したい時なんかのためにリポジトリサーバを構築してそこからパッケージをインストールするという方法があります。
今回はパブリックサブネット上にリポジトリサーバを作成し、プライベートサブネット上のサーバからリポジトリサーバのリポジトリを参照してパッケージをインストールしてみます。
構成イメージ
リポジトリサーバはインターネット上のリポジトリからパッケージをダウンロードしてきます。
リポジトリサーバからサーバAに対してリポジトリを参照させるためにapacheを導入し、httpによりアクセスさせます。
サーバAはリポジトリサーバからパッケージをインストールします。

事前準備
事前に以下のものを用意しておきます。
【リポジトリサーバ】
・インターネットに接続可能なEC2インスタンス(RHEL8.6)
※SELINUXは無効(disabled)としておきます。
【サーバA】
・インターネットに接続できないEC2インスタンス(RHEL8.6)
手順の流れ
以下の流れで実装します。
1.【リポジトリサーバ】パッケージダウンロード
2.【リポジトリサーバ】httpd導入&httpd.conf変更
3.【サーバA】リポジトリファイル変更
4.【サーバA】パッケージのインストール確認
1. 【リポジトリサーバ】パッケージダウンロード
リポジトリ用のディレクトリを作成し、インターネット上のRHELのリポジトリからデータをダウンロードしていきます。
RHEL8からはパッケージ構成が「BaseOS」と「AppStream」の2つで構成されているのでそれぞれ実施します。
# mkdir -p /repo/RHEL8 # dnf repolist --all |grep enabled ←現在有効なリポジトリを確認します。 ansible-2-for-rhel-8-rhui-rpms Red Hat Ansible Engine 2 enabled epel Extra Packages for Enterp enabled epel-modular Extra Packages for Enterp enabled rhel-8-appstream-rhui-rpms Red Hat Enterprise Linux enabled rhel-8-baseos-rhui-rpms Red Hat Enterprise Linux enabled rhui-client-config-server-8 RHUI Client Configuration enabled ↑「rhel-8-baseos-rhui-rpms」と「rhel-8-appstream-rhui-rpms」がリポジトリIDになります。
reposyncコマンドでデータをダウンロードします。
最新のパッケージのみを取得するために–newest-onlyオプションを指定します。
(指定しない場合は古いバージョンも一緒に取得されます。)
また、今回はRHEL8.6のパッケージを取得するために–releasever=8.6というオプションも指定します。
(指定しない場合はRHEL8.7(現時点の最新)バージョンのパッケージが取得されます。)
# reposync -p /repo/RHEL8 --download-metadata --repo=rhel-8-baseos-rhui-rpms --newest-only --releasever=8.6 # reposync -p /repo/RHEL8 --download-metadata --repo=rhel-8-appstream-rhui-rpms --newest-only --releasever=8.6
2.【リポジトリサーバ】httpd導入&httpd.conf変更
リポジトリサーバにhttpdの導入とサーバAにリポジトリを参照させるための設定をしていきます。
# dnf install httpd
httpd.confを一部変更と追加します。
# vi /etc/httpd/conf/httpd.conf 【変更】 DocumentRoot "/var/www/html" ↓ DocumentRoot "/repo" 【追加】 <Directory "/repo"> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
変更後にhttpdを再起動。
# systemctl restart httpd
3.【サーバA】リポジトリファイル変更
サーバAの/etc/yum.repos.d配下にreposerver.repoというファイルを作成し、その中でリポジトリサーバのリポジトリを参照しにいく設定をします。
# vi /etc/yum.repos.d/reposerver.repo
BaseOSとAppstreamについてそれぞれ記載して保存。
[reposerver-rhel8-baseos] name=reposerver-rhel8-baseos baseurl=http://[リポジトリサーバのローカルIP]/RHEL8/rhel-8-baseos-rhui-rpms gpgcheck=0 enabled=1 [reposerver-rhel8-appstream] name=reposerver-rhel8-appstream baseurl=http://[リポジトリサーバのローカルIP]/RHEL8/rhel-8-appstream-rhui-rpms gpgcheck=0 enabled=1
4.【サーバA】パッケージのインストール確認
まず、リポジトリサーバのセキュリティグループのインバウンドでサーバAからのhttp(80番)を許可しておきます。
※サーバAからリポジトリサーバへのアウトバウンドとしてhttp(80番)も許可が必要です。
実際にリポジトリサーバからパッケージをインストールできるか確認します。
# dnf clean all
# dnf repolist --all | grep enable
reposerver-rhel8-appstream reposerver-rhel8-appstrea enabled
reposerver-rhel8-baseos reposerver-rhel8-baseos enabled
↑BaseOSとAppStreamがenabledになっていることを確認します。
試しにpython3がインストールできるか確認。
# dnf install python3
Repository列でreposerver.repoに設定した、リポジトリサーバのrepoidが表示されているのでリポジトリサーバからパッケージを取得していることが分かります。

以上で完了。
コメント