AWS CDKで踏み台サーバを構築する

業務でAWS CDKを使ってインフラ構築をすることになったため、簡単な踏み台サーバをCDKで構築してみた。

環境

  • CDK:2.90.0

CDKコード

cdkにBasionHostLinuxという踏み台サーバ用のコンストラクトが用意されているためそれを使用した。

import { Stack, StackProps } from 'aws-cdk-lib'
import * as ec2 from 'aws-cdk-lib/aws-ec2'
import { Construct } from 'constructs'
import * as iam from 'aws-cdk-lib/aws-iam';

export class CdkBasionStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props)

    const vpc = new ec2.Vpc(this, 'basionVPC', {
      cidr: '10.0.0.0/16',
      maxAzs: 1,
      subnetConfiguration: [
        {
          name: 'public-basion-subnet',
          subnetType: ec2.SubnetType.PUBLIC,
          cidrMask: 24,
        },
      ],
    })

    // Security Group
    const basionSG = new ec2.SecurityGroup(this, 'basionSG', {
      vpc,
      allowAllOutbound: true,
    })
    basionSG.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(22), 'Allow SSH from anywhere')

    // EC2 Instance
    const basionServer = new ec2.BastionHostLinux(this, 'basionServer', {
      vpc,
      subnetSelection: { subnetType: ec2.SubnetType.PUBLIC },
      securityGroup: basionSG,
    })
    basionServer.allowSshAccessFrom(ec2.Peer.anyIpv4())
  }
}

デプロイすると該当のリソースが作成される

cdk deploy

SSH接続する際にEC2インスタンスIDが必要になるため確認しておく

Session Managerプラグインのインストール

インストーラをダウンロードしてコマンド実行

curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"

# zip解凍
unzip sessionmanager-bundle.zip

# インストールコマンド実行
sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin

インスタンスに公開鍵を送信する

ssh接続する前に対象のEC2インスタンスに公開鍵を送信する必要がある。

aws ec2-instance-connect send-ssh-public-key \
    --instance-id {instance-id} \
    --availability-zone {az-name} \
    --instance-os-user ec2-user \
    --ssh-public-key file://{public-keyfile-path}

SSH Configの設定

以下の内容をSSH Configに設定する

Host cdk-basion
    User ec2-user
    HostName {instance-id}
    Port 22
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --profile {profile-name}"
    IdentityFile {private-keyfile-path}

接続テスト

ssh cdk-basion

参考