AWS CLI v2でAWS Systems Manager on EC2の検証環境を素早く構築する方法
2023-05-23
azblob://2023/05/23/eyecatch/2023-05-23-aws-cli-systems-manager-on-ec2-000_0.png

こんにちは、株式会社FIXERの村上です。

最近、AWS Systems Manager on EC2 の技術検証が増えてきたため、AWS CLI on PowerShell で検証環境の構築ができるようにしました。

1. 本ブログで構築されるインフラ構成図

2. 実行環境

  • PowerShell 7
  • AWS CLI v2

3. 検証環境の作成

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

PowerShell にて AWS CLI を実行するために必要なパラメータを定義します。

$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_document

# 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]オプションにてサーバーアクセスを実行します。

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