👻

【個人メモ】プライベートサブネット上にEC2を構築して、SSM経由でRDP接続できる環境構築のスクリプトを配布します。

2023/05/23に公開

配布目的

AWS Systems Manager を利用できる環境をすぐに用意したいため、
AWS CLI v2 で環境構築できるPowerShellスクリプトを配布します。

実行環境

基本的には、AWS CloudShell を想定しています。
または、PowerShell 7.3.4 と AWS CLI v2.11.20 をインストールされたローカル環境
ローカル環境については、ブログ執筆時点の情報となります。あくまで推奨環境とお考えください。

(1) パラメータ を設定する

$vpc_ipv4_cidr_block = '10.0.0.0/16'
$subnet_ipv4_cidr_block = '10.0.0.0/24'
$security_group_name = 'techblog-ssm-sg'
$security_group_description = 'Security group for techblog.'
$key_name = 'techblog-keypair'
$iam_instance_profile_name = 'EC2InstanceProfile'
$role_name = 'CustomRoleEC2Administrator'
$policy_document = @"
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
"@
$ip_permissions = @"
{
  "IpProtocol": "tcp",
  "FromPort": 443,
  "ToPort": 443,
  "IpRanges": [
    {
      "CidrIp": "$vpc_ipv4_cidr_block"
    }
  ]
}
"@
$region = 'ap-northeast-1'

(2) キーペア を作成する(省略可能)

既存のキーペアを利用される場合は、省略可能です。
その場合、$key_nameの値に既存キーペア名を設定してください。

# キーペアを作成して、カレントディレクトリ配下に公開鍵をダウンロードする
aws ec2 create-key-pair --key-name $key_name --key-type rsa --key-format pem --output text > "$key_name.pem"

(3) 検証環境 を作成する

下記のPowerShellを実行します。

# IAMロール を作成する
aws iam create-role --role-name $role_name --assume-role-policy-document $policy_documet

# IAMロールの反映まで 30秒待機する
Start-Sleep -Seconds 30

# IAMロールに [AmazonSSMManagedInstanceCore] を付与する
aws iam attach-role-policy --role-name $role_name --policy-arn 'arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore'

# IAM インスタンスプロファイル を作成する
aws iam create-instance-profile --instance-profile-name $iam_instance_profile_name

# IAM インスタンスプロファイル に IAMロール を割り当てる
aws iam add-role-to-instance-profile --instance-profile-name $iam_instance_profile_name --role-name $role_name

# VPC を作成する
$vpc_id = aws ec2 create-vpc --cidr-block $vpc_ipv4_cidr_block --query 'Vpc.VpcId' --output text

# VPCのDNS属性で DNSホスト名とDNS解決 を有効にする
aws ec2 modify-vpc-attribute --vpc-id $vpc_id --enable-dns-hostnames '{"Value":true}'
aws ec2 modify-vpc-attribute --vpc-id $vpc_id --enable-dns-support '{"Value":true}'

# サブネット を作成する
$subnet_id = aws ec2 create-subnet --vpc-id $vpc_id --cidr-block $subnet_ipv4_cidr_block --query 'Subnet.SubnetId' --output text

# セキュリティグループ を作成する
$sg_id = aws ec2 create-security-group --group-name $security_group_name --description $security_group_description --vpc-id $vpc_id  --query 'GroupId' --output text

# AWS Systems Manager用のインバウンドルール を追加する
aws ec2 authorize-security-group-ingress --group-id $sg_id --ip-permissions $ip_permissions

# AMIのID を取得する
### Windows Server 2022 を選ぶ場合
$ami_id = aws ec2 describe-images --owners amazon --filters 'Name=name,Values=Windows_Server-2022-Japanese-Full-Base*' 'Name=state,Values=available' --query 'sort_by(Images, &CreationDate)[-1].ImageId' --region $region --output text

### Amazon Linux 3 を選ぶ場合
$ami_id = aws ec2 describe-images --owners amazon --filters 'Name=name,Values=al2023-ami-2023.*.*.*-kernel-6.1-x86_64' 'Name=state,Values=available' --query 'sort_by(Images, &CreationDate)[-1].[ImageId]' --region $region --output text

# インスタンスタイプ を設定する
### Windows Server 2022 を選んだユーザー向け
$instance_type = 'm6i.large'

### Amazon Linux 3 を選んだユーザー向け
$instance_type = 't2.micro'

# EC2インスタンス を作成する
aws ec2 run-instances --image-id $ami_id --instance-type $instance_type --key-name $key_name --subnet-id $subnet_id --security-group-ids $sg_id --iam-instance-profile Name=$iam_instance_profile_name --no-associate-public-ip-address

# インターフェースVPCエンドポイント を作成する
aws ec2 create-vpc-endpoint --vpc-id $vpc_id --vpc-endpoint-type Interface --service-name com.amazonaws.$region.ssm --subnet-ids $subnet_id --security-group-ids $sg_id
aws ec2 create-vpc-endpoint --vpc-id $vpc_id --vpc-endpoint-type Interface --service-name com.amazonaws.$region.ssmmessages --subnet-ids $subnet_id --security-group-ids $sg_id
aws ec2 create-vpc-endpoint --vpc-id $vpc_id --vpc-endpoint-type Interface --service-name com.amazonaws.$region.ec2messages --subnet-ids $subnet_id --security-group-ids $sg_id

### (任意) Windows Server 2022 を選んだユーザーは下記のエンドポイントも追加する
aws ec2 create-vpc-endpoint --vpc-id $vpc_id --vpc-endpoint-type Interface --service-name com.amazonaws.$region.ec2 --subnet-ids $subnet_id --security-group-ids $sg_id

リソースが利用できるまで、実行完了後から5~10分ほどかかります。
[AWS Systems Manager]コンソールにアクセスして、[フリートマネージャー] を選択します。

リモート接続したい[ノードID]を選択して、[ノードアクション] から [Connect]オプションにてサーバーアクセスを実行します。

上記のような画面が表示された場合、検証環境の構築は正常に完了しました。

Discussion