エンドポイントポリシーによりAmazon Linux 2023 dnf yumがStatus code: 403

# これは何か？
AWSのEC２セットアップ中にdnfやyumを使用しても`Status code: 403`となってしまい、インストールができなくて解決までに時間を要しました。
そのため誰かの助けになればと思い書きました。
もし筆者の間違いや、認識、思い違いなどがあればご指摘ください。

ではスタート！！

# 事件が起きました！Amazon Linux 2023でdnfやyumで403
AWSのEC2のお話しです。
Dockerコンテナ内ではなく、ホストマシンのお話です。
調べるとリポジトリのロックなどの記事がありますが、欲しい情報はそうでは、無かった。。。

# 環境
- 東京リージョン　`ap-northeast-1`　

# 結論
- s3向けのゲートウェイ型エンドポイントのポリシーに１行追加しました。
- 追加したポリシーがこれ！
`"arn:aws:s3:::al2023-repos-ap-northeast-1-de612dc2/*"`
- なおS3へのバケットポリシーがフルアクセス`"Resource": "*"`の状態であれば、このような問題は発生しないです。

- 例
```
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:*",
			"Resource": [
				"arn:aws:s3:::hoge-bucket",
				"arn:aws:s3:::hoge-bucket/*",
				"arn:aws:s3:::al2023-repos-ap-northeast-1-de612dc2/*" ←これを追加
			]
		}
	]
}
```

- S3へのゲートウェイエンドポイントを作成したVPCでは、リポジトリ（S3）への許可が必要ということに気がつきました。


# 状態としてはこのような感じです。
gitでもdockerでもインストールしようとすると必ず怒られます。
```
$ sudo dnf install -y git
Amazon Linux 2023 repository                                                                                                                                                                                                             813  B/s | 243  B     00:00    
Errors during downloading metadata for repository 'amazonlinux':
  - Status code: 403 for https://al2023-repos-ap-northeast-1-de612dc2.s3.dualstack.ap-northeast-1.amazonaws.com/core/mirrors/2023.5.20240819/x86_64/mirror.list (IP: 52.219.16.134)
  - Status code: 403 for https://al2023-repos-ap-northeast-1-de612dc2.s3.dualstack.ap-northeast-1.amazonaws.com/core/mirrors/2023.5.20240819/x86_64/mirror.list (IP: 52.219.12.70)
  - Status code: 403 for https://al2023-repos-ap-northeast-1-de612dc2.s3.dualstack.ap-northeast-1.amazonaws.com/core/mirrors/2023.5.20240819/x86_64/mirror.list (IP: 52.219.162.100)
Error: Failed to download metadata for repo 'amazonlinux': Cannot prepare internal mirrorlist: Status code: 403 for https://al2023-repos-ap-northeast-1-de612dc2.s3.dualstack.ap-northeast-1.amazonaws.com/core/mirrors/2023.5.20240819/x86_64/mirror.list (IP: 52.219.12.70)
Amazon Linux 2023 Kernel Livepatch repository                                                                                                                                                                                            841  B/s | 243  B     00:00    
Errors during downloading metadata for repository 'kernel-livepatch':
  - Status code: 403 for https://al2023-repos-ap-northeast-1-de612dc2.s3.dualstack.ap-northeast-1.amazonaws.com/kernel-livepatch/mirrors/al2023/x86_64/mirror.list (IP: 52.219.199.36)
  - Status code: 403 for https://al2023-repos-ap-northeast-1-de612dc2.s3.dualstack.ap-northeast-1.amazonaws.com/kernel-livepatch/mirrors/al2023/x86_64/mirror.list (IP: 52.219.172.56)
  - Status code: 403 for https://al2023-repos-ap-northeast-1-de612dc2.s3.dualstack.ap-northeast-1.amazonaws.com/kernel-livepatch/mirrors/al2023/x86_64/mirror.list (IP: 52.219.0.198)
Error: Failed to download metadata for repo 'kernel-livepatch': Cannot prepare internal mirrorlist: Status code: 403 for https://al2023-repos-ap-northeast-1-de612dc2.s3.dualstack.ap-northeast-1.amazonaws.com/kernel-livepatch/mirrors/al2023/x86_64/mirror.list (IP: 52.219.172.56)
Ignoring repositories: amazonlinux, kernel-livepatch
No match for argument: git
Error: Unable to find a match: git
```

# 原因と解決策
EC２とS３の間の通信料金を無料にする目的で、VPCは特定S3バケットに対して、VPCエンドポイントのゲートウェイ型を使っていました。

エンドポイントポリシーのResouceには`hoge-bucket`バケットのみ許可しています。
```
			"Resource": [
				"arn:aws:s3:::hoge-bucket",
				"arn:aws:s3:::hoge-bucket/*",
			]
```

下記の記事を参考に、Resouceにリポジトリにアクセスできる許可を追加したら解決です！。

- s3向けのゲートウェイ型エンドポイントのポリシーに１行追加
- 追加したポリシー
`"arn:aws:s3:::al2023-repos-ap-northeast-1-de612dc2/*"`
- 参考にした記事
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501225/1f0813ca-0225-f119-4a9b-c5508418e0a0.png)

# 試行錯誤と考察

- エラー内容ではリポジトリにアクセスできない内容だった
- エンドポイントを作成していなかったデフォルトVPCで、Amazon Linux 2023をテストしたら、インストールができていた事もあり、何か根本的に変だ？
- ネットワークに問題があると睨んでいたが、ルートテーブル、サブネット、など付け替えましたが変わりません。
- 『EC２とS３の間の通信料金を無料にする』は、S3に対してインターネットを通らないという事になるのですが、リポジトリがS3に置いてあることに気がつくまで、しばらく時間がかかった。
- よって、S3へのゲートウェイエンドポイントを作成していなかったデフォルトVPCでテストが成功していたのは、①インターネット経由でリポジトリ（S3）へ通信しているのか、②ひょっとしたら暗黙のエンドポイントがあってresouceのポリシーがフルアクセス`"Resource": "*"`の状態なものか、のどちらかであると考えられ、エンドポイントを作成しているVPCで、S３への許可が必要ということに気がつきました。
- なおS3へのバケットポリシーがフルアクセス`"Resource": "*"`の状態であれば、このような問題は発生しないです。

# 参考記事
https://repost.aws/ja/knowledge-center/ec2-troubleshoot-yum-errors-al1-al2