今回はCloudFormationテンプレートを使って、VPC内のEC2インスタンスからOpenSearch Service(旧Elasticsearch Service)にアクセスするための設定を行います。
このCloudFormationテンプレートを使用することで、VPC内のEC2インスタンスからOpenSearchにアクセスするための完全な環境を自動的に設定できます。
このテンプレートでは、VPC、サブネット、セキュリティグループ、EC2インスタンス、IAMロール、IAMインスタンスプロファイル、およびOpenSearchドメインを作成する方法を使用しています。テンプレートの流れは以下の通りです。
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
2.検索枠に「cloudformation」を記入すると、検索結果に「CloudFormation」が表示されます。CloudFormationをクリックすると、CloudFormationパンネルに遷移されます。
「送信」をクリックすると下記のスタックを作成している画面が表示されます。ステータスのところに CREATE_IN_PROGRESSと表示されることが確認できます。
この記事が、CloudFormationテンプレートを使用してVPC内のEC2インスタンスからOpenSearch Serviceにアクセスする際のお役に立てば幸いです。ぜひ試してみてください。