AWS CloudFormationでEC2起動時にインスタンスメタデータサービスのバージョンをV2(IMDSv2)に指定する方法

AWS CloudFormationでEC2起動時にインスタンスメタデータサービスのバージョンをV2(IMDSv2)に指定する方法

Clock Icon2024.11.22

こんにちは。まるとです。

Amazon EC2ではインスタンスのメタデータを取得できるインスタンスメタデータサービス(IMDS)というものがございます。
多くの場合、セキュリティの観点からメタデータ取得の際にトークンを必須とする、インスタンスメタデータサービスバージョン 2(IMDSv2)を利用されている方も多いのではないでしょうか。

今回、AWS CloudFormationでAmazon EC2 インスタンスを起動する際に、明示的にIMDSv2を設定しようとしてつまづいたので、自身のメモとして本記事を執筆します。

先に結論

AWS CloudFormationでAmazon EC2が利用するインスタンスメタデータサービスをバージョン2(IMDSv2)に設定するには、起動テンプレートを利用する必要があります。

ドキュメントを改めて読んでみよう

AWS CLIなどを利用する場合は、HttpTokensというパラメータにrequiredを設定することでIMDSv2を指定できました。
AWS CloudFormationでも、AWS::EC2::Instanceに同様のパラメータを指定すれば良いのでは?と思う方(自分だけかもしれませんが)もいるかもしれませんが、ドキュメントを改めて読んでみると以下の記載があります。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/configuring-IMDS-new-instances.html

AWS CloudFormation を使用してインスタンスのメタデータオプションを指定するには、「AWS CloudFormation ユーザーガイド」の「AWS::EC2::LaunchTemplate MetadataOptions」プロパティを参照してください。

上記の記載の通り、AWS CloudFormationでインスタンス起動時にIMDSv2を指定するには、一度起動テンプレートを作成してAWS::EC2::Instanceに紐づける必要があります。

では実際にAWS CloudFormationのテンプレートを書いてみましょう。
※下記テンプレートは分かりやすく説明するために、VPCなどの設定を省略しています。ご利用の際は、環境に合わせて適宜修正を行ってください。


AWSTemplateFormatVersion: 2010-09-09
Description: Set IMDSv2 to EC2 Instance

Resources: 
# ------------------------------- #
# EC2
# ------------------------------- #
# Launch Template
  EC2LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties:
      LaunchTemplateName: SetIMDSv2
      LaunchTemplateData:
        MetadataOptions:
          HttpTokens: required

# EC2 Instance
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t3.micro
      ImageId: ami-094dc5cf74289dfbc  # Amazon Linux 2023
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: 0
          SubnetId: subnet-xxxxxxxxxxxxxxxxx  # Subnet ID
          GroupSet: 
           - sg-xxxxxxxxxxxxxxxxx  # Security Group ID
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeSize: 8
            VolumeType: gp3
            Encrypted: true
      LaunchTemplate:
        LaunchTemplateId: !Ref EC2LaunchTemplate
        Version: !GetAtt EC2LaunchTemplate.LatestVersionNumber
      Tags:
        - Key: Name
          Value: IMDSv2SampleInstance

ポイントは、まず起動テンプレートでHttpTokens: requiredを設定します。

LaunchTemplateData:
  MetadataOptions:
    HttpTokens: required

その後、EC2 インスタンスに起動テンプレートを紐づける形に設定しています。

LaunchTemplate:
  LaunchTemplateId: !Ref EC2LaunchTemplate
  Version: !GetAtt EC2LaunchTemplate.LatestVersionNumber

起動テンプレートは、プロパティの記載がない場合、テンプレートに設定を含めないことができます。
これにより、IMDSv2を必須にしつつ、EC2 インスタンスのプロパティを細かく制御することができます。

以上でAWS CloudFormationにおいて、EC2 インスタンス起動時にIMDSv2を必須にすることができました。

まとめ

AWS マネジメントコンソールやAWS CLIでEC2 インスタンスを起動する際にバージョンを指定できるため、「AWS CloudFormationでもできるのでは?」と思ったところ、起動テンプレートを介して設定する必要があることが改めて確認できました。

今回はメモのような形になりますが、少しでもお役に立てれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.