AWS CLIでEC2インスタンスの起動から接続まで
業務にてawsを使用することになりました.環境構築には,AWS CLI(Command Line Interface)を使用することにもなったので、awsとCLIの操作に慣れるために,簡単な構成作成の手順を残しておきます.
作成対象
今回はaws初心者がよくはじめに作成するであろう,下記の構成をCLIで作成します.
前提条件
環境構築には,admin権限を持つIAMユーザーを使用します.
CLIでの作業用に,アクセスキーID・シークレットアクセスキーは発行済みとしています.
CLIでの作業
タグ付け用の変数を定義しておきます.
NAME=practice
VPCの作成
VPCは,create-vpc
コマンドで作成できます.
aws ec2 create-vpc \ --cidr-block 10.0.0.0/16 \ --instance-tenancy default \ --tag-specifications "ResourceType=vpc,Tags=[{Key=Name,Value=${NAME}-vpc}]"
作成後はIDを取得しておくと,後々の作業がしやすいです.
VPC_ID=$(aws ec2 describe-vpcs --filters Name=tag:Name,Values=${NAME}-vpc \ --query "Vpcs[*].VpcId" \ --output text)
実行後,マネジメントコンソールでも確認しておきます.
「practice-vpa」が作成されています.
インターネットゲートウェイの作成
インターネットゲートウェイを作成は,create-internet-gateway
を使用します.
NTERNET_GATEWAY_ID=$(aws ec2 create-internet-gateway \ --tag-specifications "ResourceType=internet-gateway,Tags=[{Key=Name,Value=${NAME}-igw}]" \ --query "InternetGateway.InternetGatewayId" \ --output text)
作成できたらattach-internet-gateway
で先ほどのVPCのIDを指定し,紐付けます.
aws ec2 attach-internet-gateway \ --internet-gateway-id $INTERNET_GATEWAY_ID \ --vpc-id $VPC_ID
マネージメントコンソールからも確認します.
状態が「Attached」で,VPC IDが先程作成したVPCのものになっているはずです.
Subnetの作成
VPC内に,パブリックサブネットを作成します.アベイラビリティーゾーンを指定する場合は、引数[--availability-zone <value>]
[--availability-zone-id <value>]
のいずれか一方のみの指定でOKです. ここでは、idとしてus-west-2a
を指定しています.また,サブネット作成とあわせてIDも変数に格納しています.
PUBLIC_SUBNET_ID=$(aws ec2 create-subnet \ --vpc-id $VPC_ID \ --cidr-block 10.0.1.0/24 \ --availability-zone-id usw2-az1 \ --tag-specifications "ResourceType=subnet,Tags=[{Key=Name,Value=${NAME}-public-subnet-2a}]" \ --query "Subnet.SubnetId" \ --output text)
アベイラビリティーゾーンとして指定可能なIDや名称はaws ec2 describe-availability-zones
で確認可能です.
ルートテーブルの作成と編集
create-route-table
で,ルートテーブルを作成します.
PUBLIC_ROUTE_TABLE_ID=$(aws ec2 create-route-table \ --vpc-id $VPC_ID \ --tag-specifications "ResourceType=route-table,Tags=[{Key=Name,Value=${NAME}-public-route}]" \ --query "RouteTable.RouteTableId" \ --output text)
作成したルートテーブルに,インターネットゲートウェイへのルートを登録します.
aws ec2 create-route \ --route-table-id $PUBLIC_ROUTE_TABLE_ID \ --destination-cidr-block 0.0.0.0/0 \ --gateway-id $INTERNET_GATEWAY_ID
インターネットゲートウェイへのルートが登録されたルートテーブルをサブネットに紐づけることで,パブリックサブネットとします.
aws ec2 associate-route-table \ --route-table-id $PUBLIC_ROUTE_TABLE_ID \ --subnet-id $PUBLIC_SUBNET_ID
セキュリティグループの作成
EC2に付与するセキュリティグループを作成します.
SECURITY_GROUP_ID=$(aws ec2 create-security-group \ --group-name ${NAME}-ec2-sg \ --description ${NAME}-ec2-sg \ --vpc-id $VPC_ID \ --tag-specifications "ResourceType=security-group,Tags=[{Key=Name,Value=${NAME}-ec2-sg}]" \ --query "GroupId" --output text)
今回は,自身のIPアドレスからのSSH接続を許可することとします.
curl
コマンドでIPアドレスを取得します.
IP=$(curl -s https://api.ipify.org)
作成したセキュリティグループのインバウンドルールに、自身のIPからのSSH接続を許可するルールを追加します.
aws ec2 authorize-security-group-ingress \ --group-id $SECURITY_GROUP_ID \ --protocol tcp \ --port 22 \ --cidr ${IP}/32
キーペアの作成
EC2インスタンスへのSSH接続用のキーペアを作成します.下記のコマンドは、キーペアの作成と,作業フォルダへのpemファイル作成を実行しています.
aws ec2 create-key-pair \ --key-name ${NAME}-key \ --query "KeyMaterial" \ --output text > ${NAME}-key.pem
EC2インスタンスの作成
作成するEC2インスタンスのAMI IDを指定します.
AMI_ID=$(aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 --query "Parameters[*].Value" --output text) && echo ${AMI_ID}
出力
ami-090bc08d7ae1f3881
こちらは,2022/2時点で無料利用枠で使用開始可能なAMIになります.
プライベートIPアドレスも指定してみます.プライベートIPアドレスは、サブネットの範囲内であることに注意します.
PRIVATE_IP_ADDRESS="10.0.1.11"
run-instances
でインスタンスを起動します.特に引数を指定しない場合は,デフォルトの仕様が適用されますが,キーペアを使用する際はここで--key-name
で対象のキーペアを指定する必要があります.
インスタンスタイプは引数--instance-type
でt2.micro
を指定しています.(デフォルトではm1.small
)となります.
INSTANCE_ID=$(aws ec2 run-instances \ --image-id $AMI_ID \ --instance-type t2.micro \ --count 1 \ --subnet-id $PUBLIC_SUBNET_ID \ --associate-public-ip-address \ --private-ip-address $PRIVATE_IP_ADDRESS \ --tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=${NAME}-ec2}]" \ --security-group-ids $SECURITY_GROUP_ID \ --key-name ${NAME}-key \ --query "Instances[*].InstanceId" \ --output text)
しばらくして,インスタンスが作成されたら,パブリックIPアドレスを取得します.
PUBLIC_IP_ADDRESS=$(aws ec2 describe-instances --instance-id $INSTANCE_ID --query "Reservations[*].Instances[*].PublicIpAddress" --output text)
上述の手順で作成したキーペアとインスタンスのパブリックIPアドレスを指定し,下記コマンドでSSH接続を行います.
ssh -i ${NAME}-key.pem ec2-user@$PUBLIC_IP_ADDRESS
ターミナルに下記の出力が表示されればOKです.
まとめ
今回はCLIの基本操作を,簡単な構成を作成しつつ練習しました.
AWS CLIについては,いくつか記事にしようと考えているので,次回以降は少しずつ複雑な構成を作成しいてみたいと思います.
※リソースの削除を忘れずに...