目次
はじめに
こんにちは、クラウド事業部の菅です。
数年前、AWSのパッケージ管理の仕組みについて興味を持ち、AWSと同じ方法で独自のリポジトリを作成できないか調査したことがありました。
当時は静的ウェブサイトホスティングの有効化が必要だと思っていましたが、弊社野本の記事を見つけVPCエンドポイントのみで実現できそうでしたので検証してみました。
構成図
準備
VPCなどのリソースの作成は省略します。
検証用のS3バケットとして、apc-kan-s3-bucketという名前のバケットを作成しています。
バケットポリシーには、以下のルールを設定しています。
- 今回作成するVPCエンドポイントを経由しないGetObjectを禁止する
- 今回作成するVPCエンドポイントを経由するGetObjectを許可する
VPCエンドポイント経由のhttpsアクセスを許可するため、明示的に許可ルールを設定しています。
使用したCloudFormationテンプレートは以下の通りです。
※S3バケット部分のみ抜粋
S3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: apc-kan-s3-bucket
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
S3BucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref S3Bucket
PolicyDocument:
Version: 2012-10-17
Statement:
- Action:
- s3:GetObject
Effect: Deny
Resource: !Join
- ''
- - !GetAtt S3Bucket.Arn
- /*
Principal: '*'
Condition:
StringNotEquals:
aws:SourceVpce: !Ref VPCEndpointS3
- Action:
- s3:GetObject
Effect: Allow
Resource: !Join
- ''
- - !GetAtt S3Bucket.Arn
- /*
Principal: '*'
Condition:
StringEquals:
aws:SourceVpce: !Ref VPCEndpointS3
リポジトリの作成
EC2内にdnfのリポジトリを作成します。
今回は、検証のためリポジトリ内にhttpdとその依存パッケージを格納しています。
sh-5.2$ cat /etc/system-release
Amazon Linux release 2023.7.20250331 (Amazon Linux)
sh-5.2$ sudo dnf install createrepo -y
Amazon Linux 2023 Kernel Livepatch repository 129 kB/s | 15 kB 00:00
Dependencies resolved.
============================================================================================================================================================
Package Architecture Version Repository Size
============================================================================================================================================================
Installing:
createrepo_c x86_64 0.20.0-1.amzn2023.0.3 amazonlinux 74 k
Installing dependencies:
createrepo_c-libs x86_64 0.20.0-1.amzn2023.0.3 amazonlinux 101 k
Transaction Summary
============================================================================================================================================================
Install 2 Packages
Total download size: 176 k
Installed size: 446 k
Downloading Packages:
(1/2): createrepo_c-0.20.0-1.amzn2023.0.3.x86_64.rpm 1.0 MB/s | 74 kB 00:00
(2/2): createrepo_c-libs-0.20.0-1.amzn2023.0.3.x86_64.rpm 1.2 MB/s | 101 kB 00:00
------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 1.6 MB/s | 176 kB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : createrepo_c-libs-0.20.0-1.amzn2023.0.3.x86_64 1/2
Installing : createrepo_c-0.20.0-1.amzn2023.0.3.x86_64 2/2
Running scriptlet: createrepo_c-0.20.0-1.amzn2023.0.3.x86_64 2/2
Verifying : createrepo_c-0.20.0-1.amzn2023.0.3.x86_64 1/2
Verifying : createrepo_c-libs-0.20.0-1.amzn2023.0.3.x86_64 2/2
Installed:
createrepo_c-0.20.0-1.amzn2023.0.3.x86_64 createrepo_c-libs-0.20.0-1.amzn2023.0.3.x86_64
Complete!
sh-5.2$ mkdir /tmp/repository && cd $_
sh-5.2$ sudo dnf install --downloadonly --downloaddir=./ httpd -y
(省略)
sh-5.2$ createrepo ./
Directory walk started
Directory walk done - 12 packages
Temporary output repo path: ./.repodata/
Preparing sqlite DBs
Pool started (with 5 workers)
Pool finished
sh-5.2$ ls -l
total 2412
-rw-r--r--. 1 root root 132150 Apr 9 06:03 apr-1.7.5-1.amzn2023.0.4.x86_64.rpm
-rw-r--r--. 1 root root 100204 Apr 9 06:03 apr-util-1.6.3-1.amzn2023.0.1.x86_64.rpm
-rw-r--r--. 1 root root 17131 Apr 9 06:03 apr-util-openssl-1.6.3-1.amzn2023.0.1.x86_64.rpm
-rw-r--r--. 1 root root 19243 Apr 9 06:03 generic-logos-httpd-18.0.0-12.amzn2023.0.3.noarch.rpm
-rw-r--r--. 1 root root 48746 Apr 9 06:03 httpd-2.4.62-1.amzn2023.x86_64.rpm
-rw-r--r--. 1 root root 1440292 Apr 9 06:03 httpd-core-2.4.62-1.amzn2023.x86_64.rpm
-rw-r--r--. 1 root root 14373 Apr 9 06:03 httpd-filesystem-2.4.62-1.amzn2023.noarch.rpm
-rw-r--r--. 1 root root 83024 Apr 9 06:03 httpd-tools-2.4.62-1.amzn2023.x86_64.rpm
-rw-r--r--. 1 root root 322442 Apr 9 06:03 libbrotli-1.0.9-4.amzn2023.0.2.x86_64.rpm
-rw-r--r--. 1 root root 33646 Apr 9 06:03 mailcap-2.1.49-3.amzn2023.0.3.noarch.rpm
-rw-r--r--. 1 root root 170180 Apr 9 06:03 mod_http2-2.0.27-1.amzn2023.0.3.x86_64.rpm
-rw-r--r--. 1 root root 62366 Apr 9 06:03 mod_lua-2.4.62-1.amzn2023.x86_64.rpm
drwxr-xr-x. 2 ssm-user ssm-user 180 Apr 9 06:04 repodata
EC2内に作成したリポジトリをS3バケットにアップロードします。
また、S3バケットをdnfのリポジトリとして参照させるために設定を追加します。
sh-5.2$ aws s3 mv ./ s3://apc-kan-s3-bucket/test-repo --recursive
(省略)
sh-5.2$ cat << 'EOS' > test.repo
[test-repo]
name=test repo
baseurl=https://apc-kan-s3-bucket.s3.$awsregion.amazonaws.com/test-repo/
enabled=0
gpgcheck=0
EOS
sh-5.2$ sudo mv test.repo /etc/yum.repos.d/
sh-5.2$ dnf repolist all
repo id repo name status
amazonlinux Amazon Linux 2023 repository enabled
amazonlinux-debuginfo Amazon Linux 2023 repository - Debug disabled
amazonlinux-source Amazon Linux 2023 repository - Source packages disabled
kernel-livepatch Amazon Linux 2023 Kernel Livepatch repository enabled
kernel-livepatch-source Amazon Linux 2023 Kernel Livepatch repository - Source packages disabled
test-repo test repo disabled
確認
S3バケットにアップロードしたリポジトリからhttpdをインストールしてみます。
sh-5.2$ dnf list httpd --disablerepo=* --enablerepo=test-repo
test repo 46 kB/s | 3.0 kB 00:00
Available Packages
httpd.x86_64 2.4.62-1.amzn2023 test-repo
sh-5.2$ sudo dnf install httpd -y --disablerepo=* --enablerepo=test-repo
test repo 135 kB/s | 12 kB 00:00
Dependencies resolved.
============================================================================================================================================================
Package Architecture Version Repository Size
============================================================================================================================================================
Installing:
httpd x86_64 2.4.62-1.amzn2023 test-repo 48 k
Installing dependencies:
apr x86_64 1.7.5-1.amzn2023.0.4 test-repo 129 k
apr-util x86_64 1.6.3-1.amzn2023.0.1 test-repo 98 k
generic-logos-httpd noarch 18.0.0-12.amzn2023.0.3 test-repo 19 k
httpd-core x86_64 2.4.62-1.amzn2023 test-repo 1.4 M
httpd-filesystem noarch 2.4.62-1.amzn2023 test-repo 14 k
httpd-tools x86_64 2.4.62-1.amzn2023 test-repo 81 k
libbrotli x86_64 1.0.9-4.amzn2023.0.2 test-repo 315 k
mailcap noarch 2.1.49-3.amzn2023.0.3 test-repo 33 k
Installing weak dependencies:
apr-util-openssl x86_64 1.6.3-1.amzn2023.0.1 test-repo 17 k
mod_http2 x86_64 2.0.27-1.amzn2023.0.3 test-repo 166 k
mod_lua x86_64 2.4.62-1.amzn2023 test-repo 61 k
Transaction Summary
============================================================================================================================================================
Install 12 Packages
Total download size: 2.3 M
Installed size: 6.9 M
Downloading Packages:
(1/12): apr-util-openssl-1.6.3-1.amzn2023.0.1.x86_64.rpm 443 kB/s | 17 kB 00:00
(2/12): generic-logos-httpd-18.0.0-12.amzn2023.0.3.noarch.rpm 985 kB/s | 19 kB 00:00
(3/12): httpd-2.4.62-1.amzn2023.x86_64.rpm 2.4 MB/s | 48 kB 00:00
(4/12): apr-util-1.6.3-1.amzn2023.0.1.x86_64.rpm 1.0 MB/s | 98 kB 00:00
(5/12): apr-1.7.5-1.amzn2023.0.4.x86_64.rpm 1.2 MB/s | 129 kB 00:00
(6/12): httpd-filesystem-2.4.62-1.amzn2023.noarch.rpm 798 kB/s | 14 kB 00:00
(7/12): httpd-core-2.4.62-1.amzn2023.x86_64.rpm 21 MB/s | 1.4 MB 00:00
(8/12): httpd-tools-2.4.62-1.amzn2023.x86_64.rpm 1.4 MB/s | 81 kB 00:00
(9/12): mailcap-2.1.49-3.amzn2023.0.3.noarch.rpm 1.6 MB/s | 33 kB 00:00
(10/12): mod_lua-2.4.62-1.amzn2023.x86_64.rpm 2.1 MB/s | 61 kB 00:00
(11/12): mod_http2-2.0.27-1.amzn2023.0.3.x86_64.rpm 3.3 MB/s | 166 kB 00:00
(12/12): libbrotli-1.0.9-4.amzn2023.0.2.x86_64.rpm 2.9 MB/s | 315 kB 00:00
------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 10 MB/s | 2.3 MB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : apr-1.7.5-1.amzn2023.0.4.x86_64 1/12
Installing : apr-util-openssl-1.6.3-1.amzn2023.0.1.x86_64 2/12
Installing : apr-util-1.6.3-1.amzn2023.0.1.x86_64 3/12
Installing : mailcap-2.1.49-3.amzn2023.0.3.noarch 4/12
Installing : httpd-tools-2.4.62-1.amzn2023.x86_64 5/12
Installing : libbrotli-1.0.9-4.amzn2023.0.2.x86_64 6/12
Running scriptlet: httpd-filesystem-2.4.62-1.amzn2023.noarch 7/12
Installing : httpd-filesystem-2.4.62-1.amzn2023.noarch 7/12
Installing : httpd-core-2.4.62-1.amzn2023.x86_64 8/12
Installing : mod_http2-2.0.27-1.amzn2023.0.3.x86_64 9/12
Installing : mod_lua-2.4.62-1.amzn2023.x86_64 10/12
Installing : generic-logos-httpd-18.0.0-12.amzn2023.0.3.noarch 11/12
Installing : httpd-2.4.62-1.amzn2023.x86_64 12/12
Running scriptlet: httpd-2.4.62-1.amzn2023.x86_64 12/12
Verifying : apr-1.7.5-1.amzn2023.0.4.x86_64 1/12
Verifying : apr-util-1.6.3-1.amzn2023.0.1.x86_64 2/12
Verifying : apr-util-openssl-1.6.3-1.amzn2023.0.1.x86_64 3/12
Verifying : generic-logos-httpd-18.0.0-12.amzn2023.0.3.noarch 4/12
Verifying : httpd-2.4.62-1.amzn2023.x86_64 5/12
Verifying : httpd-core-2.4.62-1.amzn2023.x86_64 6/12
Verifying : httpd-filesystem-2.4.62-1.amzn2023.noarch 7/12
Verifying : httpd-tools-2.4.62-1.amzn2023.x86_64 8/12
Verifying : libbrotli-1.0.9-4.amzn2023.0.2.x86_64 9/12
Verifying : mailcap-2.1.49-3.amzn2023.0.3.noarch 10/12
Verifying : mod_http2-2.0.27-1.amzn2023.0.3.x86_64 11/12
Verifying : mod_lua-2.4.62-1.amzn2023.x86_64 12/12
Installed:
apr-1.7.5-1.amzn2023.0.4.x86_64 apr-util-1.6.3-1.amzn2023.0.1.x86_64 apr-util-openssl-1.6.3-1.amzn2023.0.1.x86_64
generic-logos-httpd-18.0.0-12.amzn2023.0.3.noarch httpd-2.4.62-1.amzn2023.x86_64 httpd-core-2.4.62-1.amzn2023.x86_64
httpd-filesystem-2.4.62-1.amzn2023.noarch httpd-tools-2.4.62-1.amzn2023.x86_64 libbrotli-1.0.9-4.amzn2023.0.2.x86_64
mailcap-2.1.49-3.amzn2023.0.3.noarch mod_http2-2.0.27-1.amzn2023.0.3.x86_64 mod_lua-2.4.62-1.amzn2023.x86_64
Complete!
sh-5.2$ dnf list installed httpd
Installed Packages
httpd.x86_64 2.4.62-1.amzn2023 @test-repo
sh-5.2$ sudo systemctl start httpd
sh-5.2$ systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)
Active: active (running) since Wed 2025-04-09 06:08:16 UTC; 8s ago
Docs: man:httpd.service(8)
Main PID: 26107 (httpd)
Status: "Started, listening on: port 80"
Tasks: 177 (limit: 1057)
Memory: 13.4M
CPU: 74ms
CGroup: /system.slice/httpd.service
├─26107 /usr/sbin/httpd -DFOREGROUND
├─26108 /usr/sbin/httpd -DFOREGROUND
├─26109 /usr/sbin/httpd -DFOREGROUND
├─26160 /usr/sbin/httpd -DFOREGROUND
└─26180 /usr/sbin/httpd -DFOREGROUND
sh-5.2$ curl http://localhost/
<html><body><h1>It works!</h1></body></html>
無事、インストールすることができました!
まとめ
今回は、S3バケットをdnfのリポジトリ化してVPCエンドポイント経由でアクセスしてみました。
バケットポリシーを設定することで、VPCエンドポイントのみでhttpsアクセスすることができました。
同じS3バケットポリシーでもAPIとhttpsでアクセス可否が異なるようなので、そのうち整理したいと思います。
お知らせ
APCはAWS Advanced Tier Services (アドバンストティアサービスパートナー) 認定を受けております。
その中で私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。