🧚‍♀️

[初心者向けメモ]EC2インスタンスの作成+セッションマネージャー

2022/07/31に公開

こんにちは。深緑です。
若手研修向け用のAWSのレクチャーをしています。
こちらはその中のメモの一つです。
EC2の起動からセッションマネージャーによるコンソールのOPENまでをレクチャーしてみました。

手順

  • VPCの作成
  • キーペアの作成
  • IAMロールの作成
  • セキュリティグループの作成
  • EC2の作成
  • セッションマネージャーの起動

VPCは目的に沿ったものを個別に作るのをお勧めします。
デフォルトのVPCにEC2インスタンスを作っていくとわからなくなります。

キーペア・IAMロール・セキュリティグループは、EC2インスタンス作成時に自動で作ることもできますが、
名称がランダム文字列になり非常にわかりにくいので事前に作成するようにします。

作成したEC2は、セッションマネージャーでコンソールを開けるようにします。
SSH接続は不許可とします。

VPCの作成

最初の頃は手入力が良いですが、今回は素早く作成するためCloudFormationを使用します。
CloudFormationを使って作ると、削除も一気にできるのでトライ&エラーに便利です。

作成するVPCはシンプルな構成にしています。
一応、パブリック・プライベート共に複数のサブネットを設けています。

シンプルなVPCを作るCloudFormation
vpc.yaml
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の画面で、「スタックの作成」をクリックします。

CloudFormationでスタックの作成をクリックする画面

「テンプレートファイルのアップロード」で保存したファイルを選択。
「次へ」をクリックします。

CloudFormationでテンプレートの選択をクリックする画面

必要な情報を入力した上で、ウィザードを進めていくとスタックの作成が進み、VPCが出来上がります。
CloudFormationのパラメータ入力画面

入力画面で、「スタックの名前」はCloudFormationにおいて必須の入力項目です。
「パラメータ」はテンプレート(=今回のサンプルで言うvpc.yaml)独自の入力項目です。
今回のサンプルでは、VPCのサブネット等につけるプレフィックスと、
CIDRをパラメータとしています。

キーペアの作成

EC2のメニューからキーペアを作成します。
キーペアのタイプRSA、ファイル形式は.pemで問題ありません。

キーペアの作成画面

(当社比で)キーペアは一番忘れやすいので真っ先に作ってしまいましょう。

IAMロールの作成

今回作るEC2インスタンスは、セッションマネージャーでコンソールを開けるようにします。
セッションマネージャーでコンソールを開けるようにするには、
EC2インスタンスにセッションマネージャー(=SSM)の権限を与える必要があります。

EC2インスタンスへの権限付与は、IAMロールを作りインスタンスに紐づけることで実現できます。
IAMメニューの「ロール」でロールを作成します。
EC2インスタンス作成時に自動で作ることもできますが、
わかりにくい名前が付けられるので事前に作成しておきます。

ポリシー:AmazonSSMManagedInstanceCoreを付与します。
他のポリシーは取り急ぎ不要です。

IAMロールの作成画面

セキュリティグループの作成

EC2インスタンスには必ずセキュリティグループを付ける必要があります。
これも、EC2インスタンス作成時に自動で作ることもできますが、
わかりにくい名前が付けられるので事前に作成しておきます。

セキュリティグループは、EC2のメニューから作成します。

VPCには本記事で作成したサンプルの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ですが、インスタンスを再起動した場合と停止してから起動した場合の挙動が違います。
再起動の場合はIPが保持されますが、停止してから起動だと変わります。
詳しくはこちら。

インスタンスのライフサイクル - Amazon Elastic Compute

これは、停止してからの起動はインスタンス(=仮想マシン)が、ハードウェアが変わるからと言われています。
IPが変わらないようにするには固定IPアドレス(=Elastic IP)を使用します。
これらは次回以降で説明します。

参考

AWS CloudFormation VPC テンプレート

Discussion