【学習記録】AWS CLIでEC2起動してSSHで接続

サブネットと外部インターネットに繋がってるカスタムルートテーブルは関連づけができている状態から、キーペア、セキュリティーグループ、EC2インスタンスなどをAWS CLIで作成してSSHでEC2に接続する手順を勉強しました。
忘れないようにまとめておきます。

EC2をサブネット内で起動する前に、インスタンスがパブリックIPを自動で受信できるように設定しておきます。

以下のコマンドを実行します。

aws ec2 modify-subnet-attribute --subnet-id subnet-0d6f762206638a34b --map-public-ip-on-launch

JSONの出力は無し。

次にサブネット内にEC2インスタンスを起動します。

以下のコマンドでキーペアを作成します。 AWS公式ドキュメントにあるコマンドを参考にしていますが、--queryオプションの意味がよくわかっておらず、要調査です。

aws ec2 create-key-pair --key-name 20201215keypair --query 'KeyMaterial' --output text > 20201215keypair.pem

JSONの出力はなく、コマンドを実行したディレクトリに指定した名称でキーペアが作成されていました。

キーペアの読み込みができるように権限を変更します。正直chmodコマンドまだまだ馴染みがないので使いながらもっと勉強したいところ。

chmod 400 20201215keypair.pem 

次にVPCにセキュリティーグループを作成します。

aws ec2 create-security-group --group-name SSHAccess --description "secrity group for SSH" --vpc-id vpc-02479fa33475f641d

すると作成されたセキュリティーグループのGroupIdがJSONで出力されました。

{
    "GroupId": "sg-0da4b13165f881215"
}

マネジメントコンソールから確認すると指定したグループ名とdesriptionでVPCに紐づけてセキュリティーグループが作成されていました。
f:id:JunpeiNakasone:20201217063035p:plain

作成したセキュリティーグループのポート22をどこからでもアクセスできるように変更します。

aws ec2 authorize-security-group-ingress --group-id sg-0da4b13165f881215 --protocol tcp --port 22 --cidr 0.0.0.0/0

インバウンドルールが追加されていることをマネジメントコンソールでも確認。 f:id:JunpeiNakasone:20201217063235p:plain

SSHで接続できる環境は用意できたので、次にサブネット内にEC2を起動します。 AMIのIDを指定する必要があるので、マネジメントコンソールからAmazon Linux 2のAMIのIDを確認。 f:id:JunpeiNakasone:20201217063603p:plain

AMIのIDが確認できたので、以下のコマンドを実行します。

aws ec2 run-instances --image-id ami-00f045aed21a55240 --count 1 --instance-type t2.micro --key-name 20201215keypair --security-group-ids sg-0da4b13165f881215 --subnet-id subnet-0d6f762206638a34b

run-instancesというコマンドで引数にAMIのID。インスタンス数、インスタンスタイプ、SSH用のキー名、セキュリティーグループ、どのサブネットに配置するか、を指定しているようです。

マネジメントコンソールではEC2作成画面の一つは以下のようになっています。
インスタンス数」とか「サブネット」の項目はそのままコマンドで入力している値と同じ意味になるかと思います。
f:id:JunpeiNakasone:20201217064212p:plain

コマンド実行後以下のようなJSONが出力されました。

{
    "Groups": [],
    "Instances": [
        {
            "AmiLaunchIndex": 0,
            "ImageId": "ami-00f045aed21a55240",
            "InstanceId": "i-065c579b445e18bda",
            "InstanceType": "t2.micro",
            "KeyName": "20201215keypair",
            "LaunchTime": "2020-12-16T14:14:47.000Z",
            "Monitoring": {
                "State": "disabled"
            },
            "Placement": {
                "AvailabilityZone": "ap-northeast-1c",
                "GroupName": "",
                "Tenancy": "default"
            },
            "PrivateDnsName": "ip-10-0-1-238.ap-northeast-1.compute.internal",
            "PrivateIpAddress": "10.0.1.238",
            "ProductCodes": [],
            "PublicDnsName": "",
            "State": {
                "Code": 0,
                "Name": "pending"
            },
            "StateTransitionReason": "",
            "SubnetId": "subnet-0d6f762206638a34b",
            "VpcId": "vpc-02479fa33475f641d",
            "Architecture": "x86_64",
            "BlockDeviceMappings": [],
            "ClientToken": "76d25397-832f-46ec-833a-68020348dad4",
            "EbsOptimized": false,
            "EnaSupport": true,
            "Hypervisor": "xen",
            "NetworkInterfaces": [
                {
                    "Attachment": {
                        "AttachTime": "2020-12-16T14:14:47.000Z",
                        "AttachmentId": "eni-attach-0b0fb9c7ea27c397a",
                        "DeleteOnTermination": true,
                        "DeviceIndex": 0,
                        "Status": "attaching"
                    },
                    "Description": "",
                    "Groups": [
                        {
                            "GroupName": "SSHAccess",
                            "GroupId": "sg-0da4b13165f881215"
                        }
                    ],
                    "Ipv6Addresses": [],
                    "MacAddress": "0a:4d:96:60:24:8c",
                    "NetworkInterfaceId": "eni-0ab9c69abc69bfbeb",
                    "OwnerId": "XXXXXXXXXXX",
                    "PrivateIpAddress": "10.0.1.238",
                    "PrivateIpAddresses": [
                        {
                            "Primary": true,
                            "PrivateIpAddress": "10.0.1.238"
                        }
                    ],
                    "SourceDestCheck": true,
                    "Status": "in-use",
                    "SubnetId": "subnet-0d6f762206638a34b",
                    "VpcId": "vpc-02479fa33475f641d",
                    "InterfaceType": "interface"
                }
            ],
            "RootDeviceName": "/dev/xvda",
            "RootDeviceType": "ebs",
            "SecurityGroups": [
                {
                    "GroupName": "SSHAccess",
                    "GroupId": "sg-0da4b13165f881215"
                }
            ],
            "SourceDestCheck": true,
            "StateReason": {
                "Code": "pending",
                "Message": "pending"
            },
            "VirtualizationType": "hvm",
            "CpuOptions": {
                "CoreCount": 1,
                "ThreadsPerCore": 1
            },
            "CapacityReservationSpecification": {
                "CapacityReservationPreference": "open"
            },
            "MetadataOptions": {
                "State": "pending",
                "HttpTokens": "optional",
                "HttpPutResponseHopLimit": 1,
                "HttpEndpoint": "enabled"
            }
        }
    ],
    "OwnerId": "XXXXXXXXXXX",
    "ReservationId": "r-0d64c2f6c080c6f47"
}

EC2は設定が多いのでJSONも長いです。コマンドで指定していない項目はデフォルト値が入っていると思われます。

上の状態だとstateがpendingになっているので、少し待ってから以下のコマンドで状態を確認します。

aws ec2 describe-instances --instance-id i-065c579b445e18bda

JSONの中で以下のようにrunningの表示があったので正常に起動したようです。

"State": {
                        "Code": 16,
                        "Name": "running"
                    },

起動したEC2のIPアドレスを確認し、以下のコマンドでSSH接続します。

ssh -i 20201215keypair.pem ec2-user@18.183.124.12

すると想定通りにEC2に接続できました。 f:id:JunpeiNakasone:20201217065159p:plain

EC2立ち上げて接続するところまで検証できたので、作成したリソースを削除していきます。

aws ec2 terminate-instances --instance-ids i-065c579b445e18bda

セキュリティーグループを削除。

aws ec2 delete-security-group --group-id sg-0da4b13165f881215

サブネットを削除。

aws ec2 delete-subnet --subnet-id subnet-0d6f762206638a34b

カスタムルートテーブルを削除。

aws ec2 delete-route-table --route-table-id rtb-02764c54f3e3c886f

VPCからインターネットゲートウェイのデタッチ。

aws ec2 detach-internet-gateway --internet-gateway-id igw-018f9fcec0e9b94b3 --vpc-id vpc-02479fa33475f641d

VPCの削除。

aws ec2 delete-vpc --vpc-id vpc-02479fa33475f641d