[初心者向けメモ]EC2インスタンスの作成+セッションマネージャー
こんにちは。深緑です。
若手研修向け用のAWSのレクチャーをしています。
こちらはその中のメモの一つです。
EC2の起動からセッションマネージャーによるコンソールのOPENまでをレクチャーしてみました。
手順
- VPCの作成
- キーペアの作成
- IAMロールの作成
- セキュリティグループの作成
- EC2の作成
- セッションマネージャーの起動
VPCは目的に沿ったものを個別に作るのをお勧めします。
デフォルトのVPCにEC2インスタンスを作っていくとわからなくなります。
キーペア・IAMロール・セキュリティグループは、EC2インスタンス作成時に自動で作ることもできますが、
名称がランダム文字列になり非常にわかりにくいので事前に作成するようにします。
作成したEC2は、セッションマネージャーでコンソールを開けるようにします。
SSH接続は不許可とします。
VPCの作成
最初の頃は手入力が良いですが、今回は素早く作成するためCloudFormationを使用します。
CloudFormationを使って作ると、削除も一気にできるのでトライ&エラーに便利です。
作成するVPCはシンプルな構成にしています。
一応、パブリック・プライベート共に複数のサブネットを設けています。
シンプルなVPCを作るCloudFormation
Description:
Simple VPC
Parameters:
EnvironmentName:
Description: An environment name that is prefixed to resource names
Type: String
VpcCIDR:
Description: Please enter the IP range (CIDR notation) for this VPC
Type: String
Default: 10.192.0.0/16
PublicSubnet1CIDR:
Description: Please enter the IP range (CIDR notation) for the public subnet in the first Availability Zone
Type: String
Default: 10.192.10.0/24
PublicSubnet2CIDR:
Description: Please enter the IP range (CIDR notation) for the public subnet in the second Availability Zone
Type: String
Default: 10.192.11.0/24
PrivateSubnet1CIDR:
Description: Please enter the IP range (CIDR notation) for the private subnet in the first Availability Zone
Type: String
Default: 10.192.30.0/24
PrivateSubnet2CIDR:
Description: Please enter the IP range (CIDR notation) for the private subnet in the second Availability Zone
Type: String
Default: 10.192.31.0/24
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcCIDR
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: !Sub ${EnvironmentName}-vpc
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: !Sub ${EnvironmentName}-igw
InternetGatewayAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref InternetGateway
VpcId: !Ref VPC
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
AvailabilityZone: !Select [0, !GetAZs ""]
CidrBlock: !Ref PublicSubnet1CIDR
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: !Sub ${EnvironmentName}-public-subnet-1
PublicSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
AvailabilityZone: !Select [1, !GetAZs ""]
CidrBlock: !Ref PublicSubnet2CIDR
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: !Sub ${EnvironmentName}-public-subnet-2
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
AvailabilityZone: !Select [0, !GetAZs ""]
CidrBlock: !Ref PrivateSubnet1CIDR
MapPublicIpOnLaunch: false
Tags:
- Key: Name
Value: !Sub ${EnvironmentName}-private-subnet-1
PrivateSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
AvailabilityZone: !Select [1, !GetAZs ""]
CidrBlock: !Ref PrivateSubnet2CIDR
MapPublicIpOnLaunch: false
Tags:
- Key: Name
Value: !Sub ${EnvironmentName}-private-subnet-2
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub ${EnvironmentName}-public-routes
DefaultPublicRoute:
Type: AWS::EC2::Route
DependsOn: InternetGatewayAttachment
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
PublicSubnet1RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref PublicRouteTable
SubnetId: !Ref PublicSubnet1
PublicSubnet2RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref PublicRouteTable
SubnetId: !Ref PublicSubnet2
Outputs:
VPC:
Description: A reference to the created VPC
Value: !Ref VPC
PublicSubnets:
Description: A list of the public subnets
Value: !Join [",", [!Ref PublicSubnet1, !Ref PublicSubnet2]]
PrivateSubnets:
Description: A list of the private subnets
Value: !Join [",", [!Ref PrivateSubnet1, !Ref PrivateSubnet2]]
PublicSubnet1:
Description: A reference to the public subnet in the 1st Availability Zone
Value: !Ref PublicSubnet1
PublicSubnet2:
Description: A reference to the public subnet in the 2nd Availability Zone
Value: !Ref PublicSubnet2
PrivateSubnet1:
Description: A reference to the private subnet in the 1st Availability Zone
Value: !Ref PrivateSubnet1
PrivateSubnet2:
Description: A reference to the private subnet in the 2nd Availability Zone
Value: !Ref PrivateSubnet2
上記コードをyaml形式で保存します。
CloudFormationの画面で、「スタックの作成」をクリックします。
「テンプレートファイルのアップロード」で保存したファイルを選択。
「次へ」をクリックします。
必要な情報を入力した上で、ウィザードを進めていくとスタックの作成が進み、VPCが出来上がります。
入力画面で、「スタックの名前」はCloudFormationにおいて必須の入力項目です。
「パラメータ」はテンプレート(=今回のサンプルで言うvpc.yaml)独自の入力項目です。
今回のサンプルでは、VPCのサブネット等につけるプレフィックスと、
CIDRをパラメータとしています。
キーペアの作成
EC2のメニューからキーペアを作成します。
キーペアのタイプRSA、ファイル形式は.pemで問題ありません。
(当社比で)キーペアは一番忘れやすいので真っ先に作ってしまいましょう。
IAMロールの作成
今回作るEC2インスタンスは、セッションマネージャーでコンソールを開けるようにします。
セッションマネージャーでコンソールを開けるようにするには、
EC2インスタンスにセッションマネージャー(=SSM)の権限を与える必要があります。
EC2インスタンスへの権限付与は、IAMロールを作りインスタンスに紐づけることで実現できます。
IAMメニューの「ロール」でロールを作成します。
EC2インスタンス作成時に自動で作ることもできますが、
わかりにくい名前が付けられるので事前に作成しておきます。
ポリシー:AmazonSSMManagedInstanceCoreを付与します。
他のポリシーは取り急ぎ不要です。
セキュリティグループの作成
EC2インスタンスには必ずセキュリティグループを付ける必要があります。
これも、EC2インスタンス作成時に自動で作ることもできますが、
わかりにくい名前が付けられるので事前に作成しておきます。
セキュリティグループは、EC2のメニューから作成します。
VPCには本記事で作成したサンプルのVPCを選択します。
インバウンド・アウトバウンドは取り急ぎデフォルトのままで良いです。
EC2の作成
EC2のインスタンスから、「インスタンスを起動」を作成します。
なお、EC2インスタンスは、起動=作成で、削除=終了です。
順次設定を入力していきます。
今回は以下のようにします。
設定項目 | 設定値 |
---|---|
OSイメージ | Amazon Linux |
インスタンスタイプ | t2.micro |
キーペア | 本記事で作成したキーペア |
以下のものは、Network settingsの「編集」をクリックしてから入力します。
設定項目 | 設定値 |
---|---|
VPC | 本記事でVPC |
サブネット | 本記事で作成したVPCからパブリックサブネットのどれかを選択 |
パブリック IP の自動割り当て | 有効 |
セキュリティグループ | 本記事で作成したセキュリティグループ |
以下のものは、高度な詳細で入力します。
設定項目 | 設定値 |
---|---|
IAM インスタンスプロフィール | 本記事作成したIAMロール |
最後にユーザーデータに下記のスクリプトを入力します。
ユーザーデータはインスタンス作成時に実行されるスクリプトで、
このスクリプトはamazon-ssm-agentをインストールしています。
amazon-ssm-agentをインストールするユーザーデータ
yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
systemctl enable amazon-ssm-agent
systemctl start amazon-ssm-agent
EC2インスタンスをセッションマネージャーで開くには、
インスタンス側にamazon-ssm-agentが必要です。
インスタンス起動後にSSHで入ってamazon-ssm-agentをインストールすることもできますが、
そのためだけにSSHを有効化するのは避けたいので、
本記事ではユーザーデータを用いてamazon-ssm-agentをインストールしています。
セッションマネージャーでコンソールを開く
System Managerのメニューで「セッションマネージャー」を開き、
インスタンスを選択してから「セッションの開始」をクリックします。
この時、インスタンスが起動しきってない場合、ポリシーが足らない場合、amazon-ssm-agentがインストールされてない場合は、インスタンスが選択肢に出てきません。
再起動と停止・起動の違い
本記事ではEC2作成時にパブリックIPを有効化したので、
インスタンスの一覧にパブリックIPが表示されます。このIPを用いて、外から通信が可能です。
このパブリックIPですが、インスタンスを再起動した場合と停止してから起動した場合の挙動が違います。
再起動の場合はIPが保持されますが、停止してから起動だと変わります。
詳しくはこちら。
インスタンスのライフサイクル - Amazon Elastic Compute
これは、停止してからの起動はインスタンス(=仮想マシン)が、ハードウェアが変わるからと言われています。
IPが変わらないようにするには固定IPアドレス(=Elastic IP)を使用します。
これらは次回以降で説明します。
Discussion