omuronの備忘録

個人的な備忘録

「JAWS-UG CLI専門支部 #178R SSM基礎 (セッションマネージャ)」 PrivateにSSM接続できるかを試してみた #jawsug_cli

jawsug-cli.connpass.com

春ですね。 新生活の始まりの時期です。 例に漏れず、私生活がバタバタしてブログが書けてないという良くない状況でした。
波田野さんが「最近ブログとかもなくて寂しい」的なことをおっしゃっており、コミュニティに微妙ながらも貢献できたらと思いその後のやり取りについて検証してみたいと思います。

その後のやりとり

うん、言われてみればマネコンは API のラッパーなのでできないですね。
ということで試してみました。

環境構築

bastion 用の EC2 をパブリックとプライベートの VPC に構築します。

前提条件

  • パブリックサブネットとプライベートサブネットを持った VPC が準備されていること
  • SSM 接続できる IAM ユーザーがいること

CloudFormation テンプレート

AWSTemplateFormatVersion: 2010-09-09
Description: Bastion

Parameters:
  InstanceType:
    Description: Instance type
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.nano
      - t3.micro
      - t3.small
  VpcId:
    Description: VPC ID
    Type: String
  VpcPublicId:
    Description: VPC public subnet ID
    Type: String
  VpcPrivateId:
    Description: VPC private subnet ID
    Type: String

Resources:
  # セキュリティグループ
  BastionSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: bastion
      VpcId: !Sub ${VpcId}
      Tags:
        - Key: Name
          Value: bastion

  # アウトバウンド
  # yum 向けに 80 を許可
  BastionSGEgressAllowHttp:
    Type: AWS::EC2::SecurityGroupEgress
    Properties:
      GroupId: !GetAtt BastionSecurityGroup.GroupId
      CidrIp: 0.0.0.0/0
      IpProtocol: tcp
      FromPort: 80
      ToPort: 80
      Description: yum (http)
  # Session Manager 向けに 443 を許可
  BastionSGEgressAllowHttps:
    Type: AWS::EC2::SecurityGroupEgress
    Properties:
      GroupId: !GetAtt BastionSecurityGroup.GroupId
      CidrIp: 0.0.0.0/0
      IpProtocol: tcp
      FromPort: 443
      ToPort: 443
      Description: Session Manager (https)

  # IAM ロール
  BastionInstanceRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: bastion
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

  # インスタンスプロファイル
  BastionInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles: [ !Ref BastionInstanceRole ]
      InstanceProfileName: bastion

  # EC2 インスタンス
  BastionInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-06098fd00463352b6
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeSize: 8
            VolumeType: gp2
            DeleteOnTermination: true
      EbsOptimized: true
      IamInstanceProfile: !Ref BastionInstanceProfile
      InstanceType: !Ref InstanceType
      CreditSpecification:
        CPUCredits: unlimited
      SubnetId: !Sub ${VpcPublicId}
      SecurityGroupIds: [ !Ref BastionSecurityGroup ]
      SourceDestCheck: true
      DisableApiTermination: false
      UserData: !Base64 |
        #!/bin/bash
        sudo yum -y update
        sudo yum -y install gcc
      Tags:
        - Key: Name
          Value: bastion-public

  # EC2 インスタンス
  PrivateInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-06098fd00463352b6
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeSize: 8
            VolumeType: gp2
            DeleteOnTermination: true
      EbsOptimized: true
      IamInstanceProfile: !Ref BastionInstanceProfile
      InstanceType: !Ref InstanceType
      CreditSpecification:
        CPUCredits: unlimited
      SubnetId: !Sub ${VpcPrivateId}
      SecurityGroupIds: [ !Ref BastionSecurityGroup ]
      SourceDestCheck: true
      DisableApiTermination: false
      UserData: !Base64 |
        #!/bin/bash
        sudo yum -y update
        sudo yum -y install gcc
      Tags:
        - Key: Name
          Value: bastion-private

パラメーター

  • InstanceType : インスタンスタイプを選択
  • VpcId : VPC の ID を指定
  • VpcPublicId : パブリックの VPC サブネット ID を指定
  • VpcPrivateId : プライベートの VPC サブネット ID を指定

セキュリティグループ

yum とセッションマネージャを利用するためにアウトバウンドに 80/443 の穴を開けます。
インバウンドは開けません。

IAM ロール

AmazonSSMManagedInstanceCore のマネージドポリシーを付与します。

EC2

最新の AL2 AMI は以下のコマンドで取得しました。

aws ssm get-parameter \
  --name /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 \
  --region ap-northeast-1

セッションマネージャで接続するので、キーペアは利用しません。

結果

EC2

EC2 インスタンスがパブリックとプライベートに構築されてます。

f:id:omron:20210412121405p:plain

セッションマネージャ

セッションマネージャには、パブリックの EC2 しか見えてません。
「セッションの開始」から接続できます。

f:id:omron:20210412121510p:plain

セッションマネージャを CLI から楽に選択する場合は、こちらのブログも参考にしてください。

omuron.hateblo.jp

まとめ

マネコンにも不思議なパワーはなかった。