ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

IAM がすべての商用リージョンで AWS PrivateLink のサポートを開始しました

こんにちは、AWS グループの尾谷です。

今日は ピザ会 で見つけたアップデートを AWS CLI を使って体感したので、アップデートします。

ピザ会とは

フォージビジョンでは、毎週火曜日の定時後にエンジニアが集まって、AWS のアップデートを振り返る会 (通称ピザ会) を開催しております。

ピザ会という名前は、会社でオフライン開催していた頃に、ドミノピザを食べながら学習していたことに由来しています。

現在は大半のエンジニアがリモートワークになったため、自宅でピザを食べながら参加をしている人はあまりいないでしょうけれど、お菓子をつまみながら参加したり、アルコールを入れながら参加したりと、各自のスタイルでリラックスして参加しています。

具体的には、英語版の What’s New with AWS を開き、前回から追加されたアップデート記事を読み上げながら、それぞれにうんちくを語るという感じで進めています。
日本語版の AWS の最新情報 は翻訳されるまで数日のラグがあるため、最新のアップデートをキャッチアップするなら英語版を確認する必要があります。

もちろん、記事の読み上げには、DeepL 翻訳や Google 翻訳などを駆使します。
最近は、弊社のエンジニアが AWS が公開している whats-new-summary-notifier を利用して Slack 通知を設定してくれたので、非常に便利になりました。

上記 Slack ツールも活用しながら、スピーディーに理解を深めている中、気になるアップデートを見つけました。

aws.amazon.com

IAM が PrivateLink に対応したということで、これを使えば、インターネットに接続していないプライベート環境でも AWS ネイティブなサービスを利用できると感じました。

すべての商用リージョンの意味とは..

早速、AWS マネジメントコンソールを開き、使い慣れた東京リージョンのエンドポイントからサービスを検索するも iam が見つかりません。

こちら のドキュメントを参照したところ、以下の記載を見つけました。

IAM 用の VPC インターフェイスエンドポイントは、IAM コントロールプレーンが配置されているリージョンでのみ作成できます。商用 AWS リージョンでは、IAM コントロールプレーンはバージニア北部リージョンにあります。

バージニア北部リージョンに切り替えて、エンドポイントを検索したところ、以下のように com.amazonaws.iam が見つかりました。

「すべての商用リージョンで利用可能!」でも「商用リージョンはバージニア北部だけよ。」ということでしょうか。

これは、誤解を招く記事で残念ですが、今後、商用リージョンが増えるという前振りだと、前向きに受け取ろうと思います!

この点について、何か方法がないのか AWS サポートに問い合わせをしましたが、ドキュメントの通りという回答でした。

バージニア北部で検証

気を取り直して、バージニア北部に VPC をデプロイし、EC2 インスタンスを起動して検証してみることにしました。
バージニア北部の VPC にサブネットを 4 つ作り、プライベートサブネットにインスタンスを起動しました。

❶ EC2 Instance Connect エンドポイントを用意することで、 プライベートサブネットに起動する EC2 インスタンスに NAT インスタンスを用意することなく接続できるようにしました。

❷ EC2 インスタンスは、プライベートサブネットに起動しているので、インターネットに接続できません。

❸ 通信できないことを確認してから、PrivateLink をアタッチして変化を確認しました。

それでは、順番に作業内容と検証結果を振り返っていきます。

VPC ウィザード

VPC ウィザードを使って、VPC をデプロイしました。

EC2 Instance Connect エンドポイント

EC2 Instance Connect エンドポイントを作成しました。

これは、re:Inforce 2023 で発表されたエンドポイントで、追加料金を支払うことなくプライベートサブネットに起動した EC2 インスタンスに直接 SSH 接続ができるサービスです。

注意書きにある通り、なかなか作成されず、

10 分ほど経ってから使えるようになりました。

EC2 Instance Connect エンドポイントを経由して、プライベートサブネットのインスタンスに SSH 接続できました。

まず、インターネットに接続できないことを確認するため、curl コマンドで Google にリクエストを送信しました。
なかなかタイムアウトせず、2 分ほど待ってレスポンスが返りました。

   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
Last login: Thu Oct 24 07:33:58 2024 from 10.0.3.227
[ec2-user@ip-10-0-18-205 ~]$ curl https://google.co.jp
curl: (28) Failed to connect to google.co.jp port 443 after 130340 ms: Couldn't connect to server
[ec2-user@ip-10-0-18-205 ~]$ 

IAM インスタンスプロファイルロールがアタッチされていない場合

まず、EC2 インスタンスに IAM インスタンスプロファイルロールをアタッチしていない状態で、get-caller-identity コマンドを投入してみました。

仮想サーバー内にクレデンシャル情報が存在しないため「ローカルクレデンシャルが利用できないエラーメッセージ。」と「aws configure を起動して設定できるよ。」というメッセージが表示されました。

[ec2-user@ip-10-0-18-205 ~]$ aws sts get-caller-identity

Unable to locate credentials. You can configure credentials by running "aws configure".
[ec2-user@ip-10-0-18-205 ~]$ 

IAM インスタンスプロファイルロールをアタッチ

次に、EC2 インスタンスに、IAM インスタンスプロファイルロールをアタッチしました。
IAM ポリシーとして、ReadOnlyAccess ポリシーを含めておきました。

コマンドを投入すると、今度はレスポンスがなくなりました。
おそらく、IAM プロファイルロールによってローカルにクレデンシャルが設定されたため「クレデンシャル情報が正しいか。」IAM に問い合わせに行ったと思われます。
結局、5 分ほど経過して、ようやくプロンプトが戻りました。

[ec2-user@ip-10-0-18-205 ~]$ aws sts get-caller-identity

[ec2-user@ip-10-0-18-205 ~]$ aws sts get-caller-identity

Connect timeout on endpoint URL: "https://sts.us-east-1.amazonaws.com/"
[ec2-user@ip-10-0-18-205 ~]$ 

VPC に、IAM のインターフェイスエンドポイント (PrivateLink) である com.amazonaws.iam をアタッチしました。
すると、応答が返りました。

[ec2-user@ip-10-0-18-205 ~]$ aws iam list-roles
{
    "Roles": [
        {
            "Path": "/",
            "RoleName": "AdminQueriesXXXXXXXXLambdaRole-dev",
            "RoleId": "AROARW4YFHCXXXXXXXXXXP",
            "Arn": "arn:aws:iam::XXXXXXXXXX:role/AdminQueriesXXXXXXXXLambdaRole-dev",
            "CreateDate": "2021-09-04T18:04:55+00:00",
            "AssumeRolePolicyDocument": {
                "Version": "2012-10-17",
                "Statement": [
                    {
                        "Effect": "Allow",
                        "Pr... (略)

sts エンドポイントをアタッチ

記事によると、STS の PrivateLink を設定すると、ロールも使えるとのこと。
確かに、IAM ロールは、STS で認証するので、別で PrivateLink が必要ですよね。

VPC に、STS のインターフェイスエンドポイント (PrivateLink) である com.amazonaws.sts をアタッチしました。

すると、エンドポイントをデプロイするまでは応答がなかった sts コマンドが返るようになりました。

[ec2-user@ip-10-0-18-205 ~]$ aws sts get-caller-identity
{
    "UserId": "AROARW4YFH XXXXXXXXXXK:i-0d8d5edbe9ca25388",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/testRole-20241024/i-0d8d5edbe9ca25388"
}

まとめ

実際に操作してみることで、それぞれのエンドポイントがどの経路で通信をしているかわかり、非常に勉強になりました。

例えば、エンタープライズ企業や、大手ゲーム開発会社など、外部への通信を必要最小限にしたいというニーズは多くあります。例えば、Direct Connect でオンプレミスと接続し、Gateway Load Balancer を用いて、必要最小限のインターネットのみ通信制限をするような環境において、IAM をプライベート環境で利用できるのは非常に大きなメリットだと思います。

IAM の PrivateLink に関しては、文字通りすべてのリージョンで使える日が待ち遠しいです。

以上です。

最後までお読みくださりありがとうございました。