🌟

インスタンスメタデータからAmazon EC2 インスタンスのパブリック IPv4 アドレスを取得する

2024/06/14に公開

はじめに

Amazon EC2 (Elastic Compute Cloud) は、クラウド上でスケーラブルなコンピューティング容量を提供するサービスです。EC2インスタンスを使用する際、アプリケーションがインスタンスのパブリックIPv4アドレスを知る必要がある場合があります。例えば、外部サービスと通信するためや、アクセスログに記録するためです。このブログ記事では、Amazon EC2インスタンスのパブリックIPv4アドレスをインスタンスメタデータを使用して取得する方法について説明します。

インスタンスメタデータとは?

インスタンスメタデータは、Amazon EC2インスタンスに関する情報を提供する特別なエンドポイントです。インスタンスメタデータを使用することで、インスタンスのID、AMI ID、インスタンスタイプ、セキュリティグループなど、多くの情報にアクセスできます。このエンドポイントは、インスタンス内からのみアクセス可能で、HTTPリクエストを通じて情報を取得できます。

IMDSv1とIMDSv2について

AWSは、インスタンスメタデータサービス(IMDS)に二つのバージョンを提供しています。IMDSv1とIMDSv2です。

  • IMDSv1 初期のバージョンで、シンプルなHTTP GETリクエストでメタデータにアクセスできます。
  • IMDSv2 セキュリティ強化のために導入された新しいバージョンで、トークンベースの認証が必要です。これにより、メタデータのアクセスがより安全になります。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html

パブリックIPv4アドレスの取得方法

パブリックIPv4アドレスを取得するためには、次のURLをクエリします。

http://169.254.169.254/latest/meta-data/public-ipv4

このURLにアクセスすると、インスタンスのパブリックIPv4アドレスが返されます。以下に具体的な手順とコード例を示します。

EC2インスタンスにログイン

まず、対象のEC2インスタンスにログインします。

メタデータエンドポイントにリクエストを送信

次に、curlコマンドを使用してメタデータエンドポイントにリクエストを送信し、パブリックIPv4アドレスを取得します。

  • IMDSv1
curl http://169.254.169.254/latest/meta-data/public-ipv4
  • IMDSv2
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-ipv4

このコマンドを実行すると、インスタンスのパブリックIPv4アドレスが返されます。

スクリプトによる自動取得

頻繁にパブリックIPv4アドレスを取得する必要がある場合、スクリプトを使用して自動化することも可能です。以下は、Pythonを使用した簡単なスクリプトの例です。

import requests

def get_public_ipv4():
    token_url = "http://169.254.169.254/latest/api/token"
    metadata_url = "http://169.254.169.254/latest/meta-data/public-ipv4"
    
    # トークンの取得
    token_response = requests.put(token_url, headers={"X-aws-ec2-metadata-token-ttl-seconds": "21600"})
    token = token_response.text
    
    # パブリックIPv4アドレスの取得
    response = requests.get(metadata_url, headers={"X-aws-ec2-metadata-token": token})
    if response.status_code == 200:
        return response.text
    else:
        raise Exception("Failed to retrieve public IPv4 address")

if __name__ == "__main__":
    try:
        public_ip = get_public_ipv4()
        print(f"Public IPv4 Address: {public_ip}")
    except Exception as e:
        print(e)

このスクリプトを実行すると、インスタンスのパブリックIPv4アドレスが取得され、表示されます。

まとめ

Amazon EC2インスタンスのパブリックIPv4アドレスを取得するには、インスタンスメタデータをクエリするのが最も簡単で効率的な方法です。http://169.254.169.254/latest/meta-data/public-ipv4にアクセスすることで、パブリックIPv4アドレスを容易に取得できます。これにより、アプリケーションは必要なネットワーク情報を動的に取得でき、外部サービスとの通信やログ管理が容易になります。

Discussion