[AWS] EC2 で yum が使えなくなった – VPC エンドポイント

2019-10-03環境AWS,Linux

VPC エンドポイントを設定している場合、ポリシーに明記しないと S3 の共有バケット ( aws-cloudwatch.s3.amazonaws.com とか repo.us-east-1.amazonaws.com ) にアクセスできなくなる。

エラー1. ある日突然、 EC2 上の Amazon Linux で yum コマンド( yum list installed )を打つと HTTP Error 403 - Forbidden エラーが出て使えなくなった。

エラー2. モニタリングスクリプト ( https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip ) がダウンロードできない。

エラー内容

Case 1. yum が使えない

$ yum list installed
Loaded plugins: priorities, update-motd, upgrade-helper
Could not retrieve mirrorlist http://repo.us-east-1.amazonaws.com/latest/updates/mirror.list error was
14: HTTP Error 403 - Forbidden

Case 2. モニタリングスクリプトがダウンロードできない

$ curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>Hoge00000000</RequestId>
<HostId>HogeHOGE00000000000000000000000000000000=</HostId>
</Error>

原因

エラーが発生したのは、EC2 と S3 をプライベートサブネットでアクセスできるよう VPC エンドポイントを設置した直後だった。 VPC エンドポイントのポリシーは、特定のバケットにのみアクセス可能としてあり、原因はこれだった。

まず Amazon Linux の yum リポジトリは S3 上に置いてある。 AWS のこのバケットは誰でもアクセスできる。
今までは、インターネット経由でこのリポジトリにアクセスしていたが、今回は VPC エンドポイント経由でのアクセスとなった。
そのため、自分で作った VPC エンドポイントのポリシーのせいで AWS のバケット( S3 上の yum リポジトリ)へのアクセスが拒否された。

なぜインターネット経路ではなく、 VPC エンドポイント経由になったのか?

ルートテーブルにおいて、どちらの経路が利用されるかは、ロンゲストマッチにより決定される。

ロンゲストマッチとは、より条件にあっているものが優先(選択)されるというルール。
ロンゲストマッチ(英:longest match)とは

例えば、インターネットゲートウェイがデフォルトルート[0.0.0.0/0] 、VPC エンドポイントがプレフィックスリストで設定されている場合には、よりルートが明確な VPC エンドポイン(プレフィックスリスト)が優先される。

VPC エンドポイントには、関連づけられたプレフィックスリストID や プレフィックスリスト名、 IP があってそれらをプレフィックスリストという。

例えば、リージョン us-east-1 の S3 は、

プレフィックスリスト ID : pl-63a5400a
プレフィックスリスト名 : com.amazonaws.us-east-1.s3
Cidrs : “54.231.0.0/17" , “52.216.0.0/15"

プレフィックスリストは、 $ aws ec2 describe-prefix-lists で確認できる。

$ aws ec2 describe-prefix-lists --prefix-list-ids pl-63a5400a
{
    "PrefixLists": [
        {
            "PrefixListName": "com.amazonaws.us-east-1.s3",
            "Cidrs": [
                "54.231.0.0/17",
                "52.216.0.0/15"
            ],
            "PrefixListId": "pl-63a5400a"
        }
    ]
}

解決方法

VPC エンドポイントのポリシーで対象リポジトリ( yum とか)へのアクセスを許可する。

yum の場合、以下を Resource に追記。

"arn:aws:s3:::repo.us-east-1.amazonaws.com",
"arn:aws:s3:::repo.us-east-1.amazonaws.com/*"

※ Amazon Linux の リポジトリは、各リージョン内の S3 バケットにある。

aws-cloudwatch.s3.amazonaws.com の場合

"arn:aws:s3:::aws-cloudwatch",
"arn:aws:s3:::aws-cloudwatch/*"

VPC エンドポイントのポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::BUCKET-NAME",
                "arn:aws:s3:::BUCKET-NAME/*",
                "arn:aws:s3:::repo.us-east-1.amazonaws.com",
                "arn:aws:s3:::repo.us-east-1.amazonaws.com/*"
            ]
        }
    ]
}

リポジトリ名とかを気にせず、なんでも使えるようにしたい場合

"arn:aws:s3:::*.amazonaws.com",
"arn:aws:s3:::*.amazonaws.com/*"

Posted by Agopeanuts