[アップデート] Amazon SQS が VPC エンドポイントに対応!VPN 経由でオンプレミスからアクセスしてみた

こんにちは、菊池です。

先日のアップデートにて、Amazon SQSがVPCエンドポイント(Interface Endpoint)に対応しました!

VPCエンドポイントはAWSサービスのAPIに対して、VPC内部からインターネットを経由せずにアクセスできる機能です。昨年のInterface Endpointのリリース以降、対応するAWSのサービスが追加されていっていますが、今回、Amazon SQSが対象に追加されました。

今回は、この機能と、先日リリースされたRoute 53 リゾルバを使うことで、オンプレミスからVPNを経由してSQSを利用してみます。

[新機能]Route53 リゾルバー登場! オンプレミス-VPCの相互名前解決が簡単に実現できるようになりました!

オンプレミスからVPN経由のSQS利用

構成は以下のようなイメージになります。

Interface Endpointを使うことで、オンプレミスからVPN経由でエンドポイントにアクセスすること自体は可能になります。しかし、そのままではSQSのエンドポイント名であるsqs.ap-northeast-1.amazonaws.comをオンプレミスで名前解決すると、インターネット上のパブリックなエンドポイントにアクセスしてしまいます。そこで、Route53 リゾルバを使い、VPC内のInbound Endpointに対して名前解決することで、プライベートなVPCエンドポイントにアクセス可能になります。

VPC エンドポイントの作成

まずはSQSのVPCエンドポイントを作成します。

SQSのサービスを選択し、VPC/サブネットを選びます。

作成できました。しばらくすると利用可能になります。使用するエンドポイント名はsqs.ap-northeast-1.amazonaws.comです。

Route53 リゾルバの設定

続いて、Route53 リゾルバの設定です。今回はオンプレからの名前解決のみなので、インバウンドのみを選択します。

VPCエンドポイントと同じVPC/サブネットを選択します。

作成できました。このIPに対して名前解決します。

VPN接続

2つのエンドポイントを設定したVPCと、VPNで接続します。

アクセスする

それでは、アクセスしてみます。クライアントは、オンプレミス上のCentOS7です。

まず、Route53リゾルバで割り当てられたIPを/etc/resolve.confに記載しておきます。その上で、SQSのエンドポイントを名前解決してみます。

$ dig sqs.ap-northeast-1.amazonaws.com

; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.2 <<>> sqs.ap-northeast-1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4244
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 4, ADDITIONAL: 0

;; QUESTION SECTION:
;sqs.ap-northeast-1.amazonaws.com. IN	A

;; ANSWER SECTION:
sqs.ap-northeast-1.amazonaws.com. 60 IN	A	10.123.36.15
sqs.ap-northeast-1.amazonaws.com. 60 IN	A	10.123.36.41

;; AUTHORITY SECTION:
sqs.ap-northeast-1.amazonaws.com. 172800 IN NS	ns-1536.awsdns-00.co.uk.
sqs.ap-northeast-1.amazonaws.com. 172800 IN NS	ns-512.awsdns-00.net.
sqs.ap-northeast-1.amazonaws.com. 172800 IN NS	ns-0.awsdns-00.com.
sqs.ap-northeast-1.amazonaws.com. 172800 IN NS	ns-1024.awsdns-00.org.

;; Query time: 11 msec
;; SERVER: 10.123.36.17#53(10.123.36.17)
;; WHEN: 日 12月 16 15:25:42 JST 2018
;; MSG SIZE  rcvd: 217

sqs.ap-northeast-1.amazonaws.comに対して、プライベートIPが取得できています。続いて、オンプレのサーバからAWS CLIでSQSのAPIにアクセスしてみます。

注意点として、SQSのAPIにはsqs.ap-northeast-1.amazonaws.comの他に、レガシーAPIとしてap-northeast-1.queue.amazonaws.comというエンドポイントも存在する点があります。レガシーAPIはVPCエンドポイントに対応していませんが、AWS CLIだと、デフォルトだとレガシーAPIを使用するようで、VPCエンドポイントではなくパブリックなAPIにアクセスしてしまいました。--endpoint-urlのオプションを使ってVPCエンドポイントを利用するようにします。

$ aws sqs create-queue --queue-name test-que \
> --region ap-northeast-1 \
> --endpoint-url https://sqs.ap-northeast-1.amazonaws.com
{
    "QueueUrl": "https://sqs.ap-northeast-1.amazonaws.com/999999999999/test-que"
}

キューが作成できたので、メッセージを送信してみます。

$ aws sqs send-message \
> --queue-url "https://sqs.ap-northeast-1.amazonaws.com/999999999999/test-que" \
> --message-body "Hello SQS" \
>
{
    "MD5OfMessageBody": "5cf7495f9a4dc80d179fe9f6fxxxxxxx",
    "MessageId": "a972c412-7b01-4b7a-89a1-c59efxxxxxxx"
}

送信したメッセージの取得も問題ありません。

$ aws sqs receive-message \
> --queue-url "https://sqs.ap-northeast-1.amazonaws.com/999999999999/test-que"
{
    "Messages": [
        {
            "Body": "Hello SQS",
            "ReceiptHandle": "AQEBQAA0h1cQ5Hx0oDvvKIi3wAfkIoxRpflWun+g5h5aCw1mq+aMypqLORilWls9l7gEZ1aUbIe95F/DeYNGUrSe19dQWWkDq+W+pHI2IuQwZUYS9s5VwJDxLghD8LEz5SE26SCVZJIY88zeTImmZtmcDEVmiEUMBwPY/dVt9pZB70B1c7rqi7KO/sAGncga4tdITPY4uR5BA8x2NI8nAPlITh9e9dGv2iPrlJCBFERDExgj5eIIBsRa+kWmHs5P58T7peqXNUsYOzFP4zsNZ//ORGRJlyrJrLXejE0xH8sRgfyt7U5NTJTjAzAXcTUjLjK5Sl+aIhvmeeqoNiXxx3JXHGCT/bhqitPo2rAa1mlslIUi/NUTw7pCJK2vgTLJrFt2kTUmDDaUKGHsbWPi/9u86w==",
            "MD5OfBody": "5cf7495f9a4dc80d179fe9f6fxxxxxxx",
            "MessageId": "a972c412-7b01-4b7a-89a1-c59efaf338f6"
        }
    ]
}

最後に、キューの削除です。

$ aws sqs delete-queue \
> --queue-url "https://sqs.ap-northeast-1.amazonaws.com/999999999999/test-que"

まとめ

以上です。

Amazon SQSがVPCエンドポイントに対応したということで、オンプレからのVPN経由でのアクセスを試しました。オンプレミスの環境で、インターネットを経由しないでSQSを利用したいというケースでの参考になればと思います。