dorivenの日記

気がついたら社会人。気になる技術的なことについて少しずつ書いていけたらと思っております。

【AWS】S3に特定のVPCからしかアクセスできない独自Yumリポジトリを作成した話

現在の環境をPuppetへ以降しているが、特定のビルドされていないパッケージに関して、S3に独自リポジトリを作成したので、メモを残すです。

なぜS3に独自リポジトリ



特定の端末を自分専用のレポジトリとして公開するのは、CPUリソースがもったいない。
しかし、その端末をDBサーバやWebサーバとしての機能を持たせてしまうとアクセスコントロールや設定が煩雑になり、シンプルな状態を保てず管理が面倒になる可能性を考慮している。
他方、S3はバケット毎に独自のアクセスコントロールが記述でき、ホスティング機能からファイルサーバとしての機能をシンプルに提供できる。
(本当はS3の勉強をしたかったってのは内緒)

VPCの設定



今回はS3にYumリポジトリを作成する上で問題になるのが、S3をウェブホスティング機能を使って公開するので、特に設定をしなければ自身のYumレポジトリにだれでもダウンロードが出来てしまうことだ.
ダウンロードされる事自体は問題ないのだが、S3は従量課金制なので自身が使っていない通信でもお金を支払う必要性が出てきてしまう。
そのため、特定のVPC(もちろん設定次第で特定のグローバルIPからの通信も許可できる)からのみ通信を許可する設定を施す前準備をする。

VPCエンドポイントの作成

VPCエンドポイントとはVPCと他のAWSサービスとの通信を行うときに便利になる仕組み 。*1 詳細は以下のURL参照。
http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-endpoints.html
1. AWSマネジメントコンソールの「VPC 」を選択.
2. 次の画面で「VPCエンドポイント」を選び、「VPCエンドポイントの作成」ボタンを押す.
3. Yumレポジトリと通信を行いたいVPCを選択し、とりあえず「フルアクセス」を選択して、次へ.
4. このエンドポイントの通信に当てはめる「ルートテーブル」を選択して「エンドポイント作成」.
すると、エンドポイントに追加されているはずなので「エンドポイントID」をどこかに控えておく(vpce-abcdefghと仮定する)

S3の設定



今回は進めやすいようにバケットの名前を「mybucket」という仮定で進めていく。
バケットのポリシー設定は以下のAWSドキュメントを参考にした。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-bucket-policies-vpc-endpoint.html
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/amazon-s3-policy-keys.html

バケットの設定

特定のVPCとの通信を設定するために
S3 -> mybucket -> プロパティ -> アクセス許可 -> バケットのポリシー編集 に進む.
そして、JSONで以下のポリシーを指定.

{
	"Version": "2012-10-17",
	"Id": "S3PolicyId1",
	"Statement": [
		{
			"Sid": "DenyOtherVPC",
			"Effect": "Deny",
			"Principal": "*",
			"Action": "*",
			"Resource": "arn:aws:s3:::mybucket/*",
			"Condition": {
				"StringNotEquals": {
					"aws:sourceVpce": "vpce-abcdefgh"
				}
			}
		},
		{
			"Sid": "AllowSpecificVPC",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "*",
			"Resource": "arn:aws:s3:::mybucket/*",
			"Condition": {
				"StringEquals": {
					"aws:sourceVpce": "vpce-abcdefgh"
				}
			}
		}
	]
}

ここで重要なのはここの部分.

			"Resource": "arn:aws:s3:::mybucket/*",
			"Condition": {
				"StringEquals": {
					"aws:sourceVpce": "vpce-abcdefgh"
				}
			}

これはmybucketに対して先ほど作成したVPCエンドポイントからの通信を許可するポリシーを表している.
上のポリシーは"Not"とついてることかわ分かる通り、その他の方法でのmybucketへの通信を禁止(Deny)しているポリシーです。
ちなみにS3のポリシーの設定は 拒否 > 許可 > 暗黙の拒否 という3つの優先順位からなっており、はじめから他の通信を拒否しておくことで、うっかり通信を許可してしまうというミスを未然に防いでいます。
しかし、これだけではまだyumコマンドでS3のリポジトリへのアクセスは出来ません。

静的ウェブホスティング

今度はHTTP通信でのバケットへの通信をアクセスするように設定を行います。
それが、「静的ウェブホスティング」機能でHTTPアクセスに対して指定したリソースを取得することができるようになります(もちろん、上記のポリシーが適応された上で許可されていればの話ですが)
こいつの機能を「ウェブホスティングの機能を有効にする」を選んだで「保存」すれば機能が有効になります。
URLのルールですが、
「http://{バケット名}.s3-website-{リージョン}.amazonaws.com」
という感じになっており、今回は東京リージョンという想定なら
http://mybucket.s3-website-ap-northeast-1.amazonaws.com
でアクセスができるようになりますし、ウェブホスティングの機能のところにもそのようなURLが記述されているはずです。

Yumレポジトリのリストに追加



あとはシンプルに以下のようなファイルを /etc/yum.repos.d に追加すればおkです.

[mybucket]
name=mybucket
baseurl=http://mybucket.s3-website-ap-northeast-1.amazonaws.com/yumrepo/$basearch
gpgcheck=0
enabled=1

yumコマンドで設定したリポジトリが追加されており、独自のrpmが見つかるようになっていれば設定は問題ないでしょう。

おわりに



今回はyumレポジトリをs3上で行う話をしたが、rpmのアップロードのやり方やyumレポジトリ自体の作成の仕方については他でも解説されているような話なので触れなかった.
独自リポジトリを持つことで他のリポジトリでは持っていない、もしくはSpecファイルに対して独自の設定をしたい場合などに利用できるようになるだろう.
快適なyum&rpmライフを!

*1:今のところはS3のみが対象?