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