CloudFormationでVPC内のEC2インスタンスからOpenSearchへのアクセスを設定する方法

May
2024-11-12
2024-11-12

こんにちは。

今回はCloudFormationテンプレートを使って、VPC内のEC2インスタンスからOpenSearch Service(旧Elasticsearch Service)にアクセスするための設定を行います。

このCloudFormationテンプレートを使用することで、VPC内のEC2インスタンスからOpenSearchにアクセスするための完全な環境を自動的に設定できます。

IAMロールとインスタンスプロファイルを使用して、セキュアにOpenSearchドメインにアクセスできるようになります。

事前に準備すること

EC2を作成する前に、EC2インスタンスにSSH接続できるようにするためキーペアファイルを下記の手順通り作成して置く必要です。

■簡単なキーペア作成の方法

AWS自アカウントにログインしてください。

Amazon EC2 コンソール行って、ナビゲーションペインの [ネットワークとセキュリティで、[キーペアを選択します。そのあと、[キーペアを作成]ボタンをクリックする。

③以下の図にキーペアの名前を記入後、[キーペアを作成]ボタンをクリックすると作成したキーペアファイルは自動的にダウンロードされます。

※キーペアファイルをローカル環境のSSHディレクトリに保存してください。

key pair

テンプレートの流れ

このテンプレートでは、VPC、サブネット、セキュリティグループ、EC2インスタンス、IAMロール、IAMインスタンスプロファイル、およびOpenSearchドメインを作成する方法を使用しています。テンプレートの流れは以下の通りです。

①CloudFormationテンプレート内でVPCと必要なネットワークコンポーネントを設定する。

➁次に、EC2インスタンスとOpenSearchドメインのセキュリティグループを設定する。

③EC2インスタンスがOpenSearchにアクセスするために必要なIAMロールとインスタンスプロファイルを作成する。

④次に、IAMインスタンスプロファイルをアタッチしたEC2インスタンスを作成する。

⑤最後に、VPC内のセキュリティグループとサブネットに関連付けられたOpenSearchドメインを作成する。

テンプレートの書き方

ファイル名:ec2_opensearch_template.yaml

AWSTemplateFormatVersion:
  "2010-09-09"
Description: 自動環境構築スクリプト
# ------------------------------------------------------------#
# 踏み台サーバ用 Input Parameters (Key Pair)
# ------------------------------------------------------------#
Parameters:
  FumidaiKeyName:
    Type: "AWS::EC2::KeyPair::KeyName"
 
  FumidaiVPCCIDR:
    Description: Please enter the IP range (CIDR notation) for this FuFumidai VPC
    Type: String
    Default: 172.32.0.0/23 ←CIDR IPは自分の環境と合わせて設定してください。
 
  FumidaiPublicSubnetCIDR:
    Description: Please enter the IP range (CIDR notation) for the public subnet in the FuFumidai VPC
    Type: String
    Default: 172.32.0.0/28 ←CIDR IPは自分の環境と合わせて設定してください。
 
  DomainName:
    Description: User-defined OpenSearch domain name
    Type: String
 
Resources:
# ------------------------------------------------------------#
#  踏み台用VPC
# ------------------------------------------------------------#
# VPC Create
  FumidaiVPC:
    Type: "AWS::EC2::VPC"
    Properties:
      # VPCのCidrblockはパラメータで指定する
      CidrBlock: !Ref FumidaiVPCCIDR
      # VPC に対して DNS 解決がサポートされているか
      EnableDnsSupport: "true"
      # VPC 内に起動されるインスタンスが DNS ホスト名を取得するか
      EnableDnsHostnames: "true"
      # VPC 内に起動されるインスタンスの許可されているテナンシー
      InstanceTenancy: default
      Tags:
        - Key: Name
          Value: "fumidai-vpc"

# InternetGateway Create
  FumidaiInternetGateway:
    Type: "AWS::EC2::InternetGateway"
    Properties:
      Tags:
        - Key: Name
          Value: "fumidai-igw"

# IGW Attach
  FumidaiInternetGatewayAttachment:
    Type: "AWS::EC2::VPCGatewayAttachment"
    Properties:
      InternetGatewayId: !Ref FumidaiInternetGateway
      VpcId: !Ref FumidaiVPC

# ------------------------------------------------------------#
#  Public Subnet (踏み台用)
# ------------------------------------------------------------#          
# Public Subnet Create
  FumidaiPublicSubnet:
    Type: "AWS::EC2::Subnet"
    Properties:
      AvailabilityZone: "ap-northeast-1a"
      # VPCのPublic SubnetのCidrblockはパラメータで指定する
      CidrBlock: !Ref FumidaiPublicSubnetCIDR
      VpcId: !Ref FumidaiVPC
      Tags:
        - Key: Name
          Value: "fumidai-public-subnet"
# ------------------------------------------------------------#
#  RouteTable 
# ------------------------------------------------------------#          
# Public RouteTable Create
  FumidaiPublicRouteTable:
    Type: "AWS::EC2::RouteTable"
    Properties:
      VpcId: !Ref FumidaiVPC
      Tags:
        - Key: Name
          Value: "fumidai-public-route"

# ------------------------------------------------------------#
# Routing (ルーティング)
# ------------------------------------------------------------#
# PublicRoute Create
  FumidaiPublicRoute:
    Type: "AWS::EC2::Route"
    Properties:
      RouteTableId: !Ref FumidaiPublicRouteTable
      DestinationCidrBlock: "0.0.0.0/0"
      GatewayId: !Ref FumidaiInternetGateway

# ------------------------------------------------------------#
# RouteTable Associate
# ------------------------------------------------------------#
# PublicRouteTable Associate PublicSubnet
  FumidaiPublicSubnetRouteTableAssociation:
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties:
      SubnetId: !Ref FumidaiPublicSubnet
      RouteTableId: !Ref FumidaiPublicRouteTable
# ------------------------------------------------------------#
# WebServerセキュリティグループ作成
# ------------------------------------------------------------#
  FumidaiWebServerSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: future-sg-group
      GroupDescription: web server sg
      VpcId: !Ref FumidaiVPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
           #指定のIPから接続できるように設定する
          CidrIp: 0.0.0.0/0  ←CIDR IPは自分の環境と合わせて設定してください。
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
           #指定のIPから接続できるように設定する
          CidrIp: 0.0.0.0/0  ←CIDR IPは自分の環境と合わせて設定してください。
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
    #指定のIPから接続できるように設定する
          CidrIp: 0.0.0.0/0  ←CIDR IPは自分の環境と合わせて設定してください。
      SecurityGroupEgress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: "future-sg"
# ------------------------------------------------------------#
# OpenSearch用セキュリティグループ
# ------------------------------------------------------------#
  OpenSearchSecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      GroupDescription: "Security group for OpenSearch domain"
      VpcId: !Ref FumidaiVPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          SourceSecurityGroupId: !Ref FumidaiWebServerSG
# ------------------------------------------------------------#
# EC2 Instance Role
# ------------------------------------------------------------#
  EC2InstanceProfile:
    Type: 'AWS::IAM::InstanceProfile'
    Properties:
      Roles:
        - !Ref EC2InstanceRole

  EC2InstanceRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: 'ec2.amazonaws.com'
            Action: 'sts:AssumeRole'
      Policies:
        - PolicyName: 'OpenSearchAccess'
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - 'es:*'
                Resource: '*'
# ------------------------------------------------------------#
# EC2 (踏み台用EC2作成)
# ------------------------------------------------------------#
# EC2インスタンス
  FumidaiEc2Instance:
    Type: AWS::EC2::Instance
    Properties:
      AvailabilityZone: ap-northeast-1a
      IamInstanceProfile: !Ref EC2InstanceProfile
      ImageId: ami-0329eac6c5240c99d
      InstanceType: t2.micro
      KeyName: !Ref FumidaiKeyName
      UserData:
          Fn::Base64:  !Sub |
               #!/bin/bash
               sudo yum -y update
               sudo yum -y install httpd
               sudo systemctl start httpd.service
               sudo systemctl enable httpd.service

      NetworkInterfaces:
        # IPv4 アドレスを割り当てるか
        - AssociatePublicIpAddress: "true"
          # ------------------------------------------------------
          # アタッチの順序におけるネットワークインターフェイスの位置。
          # ネットワークインターフェイスを指定する場合必須
          # ------------------------------------------------------
          DeviceIndex: "0"
          SubnetId: !Ref FumidaiPublicSubnet
          GroupSet:
            - !Ref FumidaiWebServerSG
      Tags:
        - Key: Name
          Value: "fumidai-server-spd"
# ------------------------------------------------------------#
# OpenSearch作成(EC2から使用できるOpenSearchを作成する)
# ------------------------------------------------------------#
  OpenSearchServiceDomain:
    Type: 'AWS::OpenSearchService::Domain'
    Properties:
      DomainName: !Ref DomainName
      EngineVersion: 'OpenSearch_1.2'
      ClusterConfig:
        InstanceCount: '1'
        InstanceType: 't3.small.search'
      EBSOptions:
        EBSEnabled: true
        Iops: '0'
        VolumeSize: '10'
        VolumeType: 'gp2'
      AccessPolicies:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              AWS: '*'
            Action: 'es:*'
            Resource: !Sub 'arn:aws:es:${AWS::Region}:${AWS::AccountId}:domain/${DomainName}/*'
      AdvancedOptions:
        rest.action.multi.allow_explicit_index: 'true'
        override_main_response_version: 'true'
      Tags:
        - Key: foo
          Value: bar
      VPCOptions:
        SubnetIds:
          - Ref: FumidaiPublicSubnet
        SecurityGroupIds:
          - Ref: OpenSearchSecurityGroup

※CloudFormationテンプレート内のCidrIp:0.0.0.0/0 は、EC2インスタンスにどこからでもアクセスできる設定を意味します。これはセキュリティ上のリスクが高いため、実際に構築する際には、接続したい環境のIPアドレスを指定してください。例えば、自分のオフィスやVPNのIPアドレスに制限することで、セキュリティを強化できます。

テンプレートを使用する手順

1.AWS自アカウントにログインしてください。

2.検索枠に「cloudformation」を記入すると、検索結果に「CloudFormation」が表示されます。CloudFormationをクリックすると、CloudFormationパンネルに遷移されます。

3.「スタック作成」→「テンプレートファイルのアップロード」を選択 → 作成した「ec2_template.yaml」をアプロードして、「次へ」をクリックする。

5.スタック名記入画面が表示されます。スタック名を記入してください。

※Key Nameのところに、事前に準備したキーペアファイル名を記入してください。後「次へ」       をクリックする。

6.「次へ」をクリックすると、最後に確認画面が表示されて「送信」ボタンが表示されます。

「送信」をクリックすると下記のスタックを作成している画面が表示されます。ステータスのところに CREATE_IN_PROGRESSと表示されることが確認できます。

スタック作成完了したら、「CREATE_COMPLETE」に変わります。それで完成です。

EC2にSSHから接続確認

1.スタック作成完了後に、EC2パンネルに移行してインスタンスのところに作成したEC2インスタンスが表示されることが確認できます。

create success-1

2.EC2を選択し「接続」をクリックすると、インスタンスにSSHから接続する方法を確認できます。

ssh接続方法-3

3.SSH接続するため、ローカル環境のターミナルからsshディレクトリに行って、上記のSSHクライアントの手順通りコメント実行してください。

4.下記ようにターミナルからEC2に接続できることが確認できます。

ssh-1

OpenSearchドメインのエンドポイントの確認方法

OpenSearchドメインのエンドポイントが分からない場合、以下の手順で確認できます。

1.Amazon OpenSearch Serviceコンソールに移動します。

2.左側のナビゲーションペインで「ドメイン」をクリックします。これにより、作成されたOpenSearchドメインの一覧が表示されます。

3.リストから確認したいOpenSearchドメイン(例:「test-open-srch」)をクリックします。

4.ドメインの詳細ページが表示され、一般的な情報が記載されたセクションが表示されます。

5.そのページの「ドメインエンドポイント(VPC)」セクションに記載されているURLが、OpenSearchのドメインエンドポイントです。

このエンドポイントを使用して、VPC内のEC2インスタンスからOpenSearchドメインにアクセスできます。

EC2インスタンスからOpenSearchへのアクセス確認

EC2インスタンスからOpenSearchドメインに正しくアクセスできるか確認するため、以下のコマンドを実行してください。

このコマンドを実行することで、OpenSearchドメインに接続できるかどうかを確認できます。

接続が成功すると、OpenSearchからのレスポンスが表示されます。

curl -XGET 'OpenSearchのドメインエンドポイント'

opensearch-success-1

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

この記事が、CloudFormationテンプレートを使用してVPC内のEC2インスタンスからOpenSearch Serviceにアクセスする際のお役に立てば幸いです。ぜひ試してみてください。