AWS CLIの振り返り ~EC2基礎編~

#本記事の目的
JAWS-UG CLI オンラインハンズオンの復習として、ハンズオンで取り上げられたAWSサービスに関する用語と、使用したAWS CLI コマンドを箇条書きでまとめる。
今回はEC2基礎編を取り上げる。

#主なAWSサービス用語
####インターネットゲートウェイ
VPCとインターネットとの間の通信を可能にするオブジェクト。静的NAT変換機能とVPC⇔インターネット間のルーティング機能を有する。

####キーペア
EC2インスタンスにログインするために使用する公開鍵と秘密鍵のペア。

####Elastic IP
EC2インスタンスに静的IPv4アドレスを付与するためのオブジェクト。

####EBS
EC2インスタンス向けの、高性能で可用性に優れたブロックストレージ。スナップショットを用いる事で、S3にバックアップを取る事ができる。

####AMI
EC2インスタンスを起動するために必要となる、OSのディスクイメージを収めたデータ。


#主なAWS CLI コマンド一覧
####VPCの作成
```
$ aws ec2 create-vpc　--cidr-block <IPアドレス範囲> [--tag-specifications <タグ文字列>]
```
※タグ文字列の例：`ResourceType=vpc,Tags=[{Key=Name,Value=<VPC名>}]`

####VPCの詳細表示
```
$ aws ec2 describe-vpcs [--filters <フィルタリング条件>]
```
※`--filters`オプションの引数として"`Name=tag:Name,Values=<タグの値>`"を指定する事で、特定のタグを持つVPCを表示する。

####VPCの削除
```
$ aws ec2 delete-vpc --vpc-id <VPC ID>
```

####インターネットゲートウェイの作成
```
$ aws ec2 create-internet-gateway　[--tag-specifications <タグ文字列>]
```
※タグ文字列の例：`ResourceType=internet-gateway,Tags=[{Key=Name,Value=<インターネットゲートウェイ名>}]`

####インターネットゲートウェイの詳細表示
```
aws ec2 describe-internet-gateways [--filters <フィルタリング条件>]
```
※`--filters`オプションの引数として"`Name=attachment.vpc-id,Values=<VPC ID>`"を指定する事で、特定のVPCにアタッチされているインターネットゲートウェイを表示する。
※`--filters`オプションの引数として"`Name=tag:Name,Values=<タグの値>`"を指定する事で、特定のタグを持つインターネットゲートウェイを表示する。


####インターネットゲートウェイの削除
```
$ aws ec2 delete-internet-gateway --internet-gateway-id <インターネットゲートウェイID>
```

####インターネットゲートウェイのアタッチ
```
$ aws ec2 attach-internet-gateway --internet-gateway-id <インターネットゲートウェイID> --vpc-id <VPC ID>
```

####インターネットゲートウェイのデタッチ
```
$ aws ec2 detach-internet-gateway --internet-gateway-id <インターネットゲートウェイID> --vpc-id <VPC ID>
```

####ルートテーブルの作成
```
aws ec2 create-route-table --vpc-id <VPC ID> [--tag-specifications <タグ文字列>]
```
※タグ文字列の例：`ResourceType=route-table,Tags=[{Key=Name,Value=<ルートテーブル名>}]`

####ルートテーブルの詳細表示
```
aws ec2 describe-route-tables [--filters <フィルタリング条件>]
```
※`--filters`オプションの引数として"`Name=vpc-id,Values=<VPC ID>`"を指定する事で、特定のVPCに属するルートテーブルを表示する。
※`--filters`オプションの引数として"`Name=tag:Name,Values=<タグの値>`"を指定する事で、特定のタグを持つルートテーブルを表示する。

####ルートテーブルの削除
```
$ aws ec2 delete-route-table --route-table-id <サブネットID>
```

####ルートの作成
```
aws ec2 create-route --route-table-id <ルートテーブルID> [--destination-cidr-block <ルーティング先のIPアドレス範囲>] [--gateway-id <インターネットゲートウェイID>]
```

####ルートの削除
```
aws ec2 delete-route --route-table-id <ルートテーブルID> [--destination-cidr-block <ルーティング先のIPアドレス範囲>]
```

####サブネットの作成
```
$ aws ec2 create-subnet --vpc-id <VPC ID>　 --cidr-block <IPアドレス範囲> [--availability-zone <アベイラビリティゾーン>] [--tag-specifications <タグ文字列>]
```
※タグ文字列の例：`ResourceType=subnet,Tags=[{Key=Name,Value=<サブネット名>}]`

####サブネットの詳細表示
```
$ aws ec2 describe-subnets [--filters <フィルタリング条件>]
```
※`--filters`オプションの引数として"`Name=vpc-id,Values=<VPC ID>`"を指定する事で、特定のVPCに属するサブネットを表示する。
※`--filters`オプションの引数として"`Name=tag:Name,Values=<タグの値>`"を指定する事で、特定のタグを持つサブネットを表示する。

####サブネットの削除
```
$ aws ec2 delete-subnet --subnet-id <サブネットID>
```

####ルートテーブルとサブネットの関連付け
```
aws ec2 associate-route-table --route-table-id <ルートテーブルID> [--subnet-id <サブネットID>]
```

####ルートテーブルとサブネットの関連解除
```
aws ec2 disassociate-route-table --association-id <アソシエーションID>
```
※アソシエーションIDは、`aws ec2 describe-route-tables`コマンドの結果から確認可能

####EC2キーペアの作成
```
aws ec2 create-key-pair --key-name <キーペアの名前>
```

####EC2キーペアの詳細表示
```
aws ec2 describe-key-pairs [--filters <フィルタリング条件>]
```
※`--filters`オプションの引数として"`Name=key-name,Values=<キーペア名>`"を指定する事で、特定のキーペアを表示する。

####EC2キーペアの削除
```
aws ec2 delete-key-pair --key-name <キーペアの名前>
```

####イメージの詳細表示
```
$ aws ec2 describe-images　[--filters <フィルタリング条件>]
```
※`--filters`オプションの引数として"`Name=name,Values=<イメージ名>`"を指定する事で、特定のイメージを表示する。

####EC2インスタンスの作成
```
$ aws ec2 run-instances　[--image-id <イメージID>] [--instance-type <インスタンスタイプ>] [--tag-specifications <タグ文字列>] [--subnet-id <サブネットID>] [--user-data file://<ユーザデータのファイルパス>] [--iam-instance-profile <インスタンスプロファイル用文字列>] [--key-name <キーペア名>] [--associate-public-ip-address]
```
※`--image-id`オプションの引数としてイメージIDを指定する事で、特定のイメージを用いてインスタンスを作成する。
※`--instance-type`オプションの引数としてインスタンスタイプを指定する事で、特定のインスタンスタイプを用いてインスタンスを作成する。
※タグ文字列の例：`ResourceType=instance,Tags=[{Key=Name,Value=<インスタンス名>}]`"
※`--user-data`オプションの引数としてユーザデータのファイルパスを指定する事で、特定のユーザデータを使用してインスタンスを作成する。
※`--iam-instance-profile`オプションの引数として"`Name=<インスタンスプロファイル名>`"を指定する事で、特定のインスタンスプロファイルを使用してインスタンスを作成する。
※`--associate-public-ip-address`オプションを指定する事で、特定のパブリックIPが割り当てられたインスタンスを作成する。

####EC2インスタンスの詳細表示
```
$ aws ec2 describe-instances　[--filters <フィルタリング条件>]
```
※`--filters`オプションの引数として"`Name=tag-key,Values=<タグのキー名>　Name=tag-value,Values=<タグの値>`"を指定する事で、特定のタグのキーと値を持つインスタンスを表示する。
※`--filters`オプションの引数として"`Name=instance-state-name,Values=running`"を指定する事で、起動状態のインスタンスを表示する。

####EC2インスタンスの削除
```
$ aws ec2 terminate-instances　--instance-ids <インスタンスID>
```

####Elastic IPの取得
```
$ aws ec2 allocate-address [--tag-specifications <タグ文字列>]
```
※タグ文字列の例："`ResourceType=elastic-ip,Tags=[{Key=Name,Value=<EIP名>}]`"

####Elastic IPの一覧表示
```
$ aws ec2 describe-addresses [--filters <フィルタリング条件>]
```
※`--filters`オプションの引数として"`Name=tag:Name　,Values=<タグの値>`"を指定する事で、特定のタグのキーと値を持つEIPを表示する。

####Elastic IPの返却
```
$ aws ec2 release-address --allocation-id <EIP ID>
```

####Elastic IPのアタッチ
```
$ aws ec2 associate-address --allocation-id <EIP ID> --instance-id <インスタンスID>
```

####Elastic IPのデタッチ
```
$ aws ec2 disassociate-address --allocation-id <EIP ID>
```

####EBSの作成
```
$ aws ec2 create-volume --availability-zone <アベイラビリティーゾーン名> [--size <ボリュームのサイズ>] [--volume-type <ボリュームのタイプ>] [--tag-specifications <タグ文字列>]
```
※タグ文字列の例："`ResourceType=volume,Tags=[{Key=Name,Value=<ボリューム名>}]`"

####EBSの詳細表示
```
$ aws ec2 describe-volumes [--filters <フィルタリング条件>]
```
※`--filters`オプションの引数として"`Name=tag-key,Values=<タグのキー名>　Name=tag-value,Values=<タグの値>`"を指定する事で、特定のタグのキーと値を持つインスタンスを表示する。


####EBSの削除
```
$ aws ec2 delete-volume --volume-id <ボリュームID>
```

####EBSのアタッチ
```
$ aws ec2 attach-volume --device <デバイス名> --instance-id <インスタンスID> --volume-id <ボリュームID>
```
※デバイス名の例：/dev/sdh, xvdh

####EBSのデタッチ
```
$ aws ec2 detach-volume [--instance-id <インスタンスID>] --volume-id <ボリュームID>
```

####EBSスナップショットの作成
```
$ aws ec2 create-snapshot [--description "<スナップショットの説明文>"] --volume-id <ボリュームID> [--tag-specifications <タグ文字列>]
```
※タグ文字列の例："`ResourceType=snapshot,Tags=[{Key=Name,Value=<スナップショット名>}]`"

####EBSスナップショットの詳細表示
```
$ aws ec2 describe-snapshots [--filters <フィルタリング条件>] [--owner-ids <AWS ID>]
```
※`--filters`オプションの引数として"`Name=tag-key,Values=<タグのキー名>　Name=tag-value,Values=<タグの値>`"を指定する事で、特定のタグのキーと値を持つインスタンスを表示する。
※AWS IDは`aws sts get-caller-identity`コマンドの`Account`項目で取得可能。

####EBSスナップショットの削除
```
$ aws ec2 delete-snapshot --snapshot-id <スナップショットID>
```

####AMIの作成
```
$ aws ec2 create-image --instance-id <インスタンスID> --name <AMI名> [--description "<AMIの説明文>"]
```

####AMIの詳細表示
```
$ aws ec2 describe-images --filter [--filters <フィルタリング条件>]
```
※`--filters`オプションの引数として"`Name=name,Values=<AMI名>`"を指定する事で、特定のAMIAMIを表示する。

####AMIの削除
```
$ aws ec2 deregister-image --image-id <AMI ID>
```

####セキュリティグループの作成
```
aws ec2 create-security-group --group-name <セキュリティグループ名>  --description "<説明文>" [--vpc-id <VPC ID>]
```

####セキュリティグループの一覧表示
```
aws ec2 describe-security-groups --filter <フィルタリング条件>
```
※`--filters`オプションの引数として"`Name=vpc-id,Values=<VPC ID>`"を指定する事で、特定のVPCに属するセキュリティグループを表示する。
※`--filters`オプションの引数として"`Name=group-name,Values=<セキュリティグループ名>`"を指定する事で、特定のセキュリティグループを表示する。
※`--filters`オプションの引数として"`Name=ip-permission.protocol,Values=<セキュリティグループルールにおけるプロトコル名>`"を指定する事で、特定のプロトコルを使用するルールを持つセキュリティグループを表示する。
※`--filters`オプションの引数として"`Name=ip-permission.to-port,Values=<セキュリティグループルールにおける宛先ポート番号>`"を指定する事で、特定の宛先ポート番号を使用するルールを持つセキュリティグループを表示する。
※`--filters`オプションの引数として"`Name=ip-permission.group-id,Values=<セキュリティグループルールにおける送信元セキュリティグループ>`"を指定する事で、特定の送信元セキュリティグループを使用するルールを持つセキュリティグループを表示する。

####セキュリティグループの削除
```
aws ec2 delete-security-group --group-id <セキュリティグループID>
```

####セキュリティグループにおけるインバウンドルールの認証
```
aws ec2 authorize-security-group-ingress [--group-id <セキュリティグループID>]　[--protocol <プロトコル名>] [--port <ポート番号>] [--cidr <IPアドレス範囲>]　[--source-group <送信元セキュリティグループ>] [--tag-specifications <タグ文字列>]
```
※タグ文字列の例：ResourceType=security-group-rule,Tags=[{Key=Name,Value=<セキュリティグループルール名>]

####セキュリティグループにおけるインバウンドルールの詳細表示
```
aws ec2 describe-security-group-rules --max-results <最大表示数> --filter <フィルタリング条件>　Name=tag:Name,Values=${EC2_SECURITY_GROUP_RULE_TAG_NAME}
```
※`--filters`オプションの引数として"`Name=group-name,Values=<セキュリティグループ名>`"を指定する事で、特定のセキュリティグループに属するルールを表示する。
※`--filters`オプションの引数として"`Name=tag:Name,Values=<タグの値>`"を指定する事で、特定のタグを持つセキュリティグループルールを表示する。

####セキュリティグループにおけるインバウンドルールの取消
```
aws ec2 revoke-security-group-ingress [--group-id <セキュリティグループID>] [--security-group-rule-ids "<セキュリティグループにおけるインバウンドルールID>"]
```

#参考文献
- AWSCLIコマンドリファレンス:[EC2](https://docs.aws.amazon.com/cli/latest/reference/ec2/)
- JAWS-UG CLI専門支部：[ハンズオン(簡易版): EC2基礎 (VPC)](http://prototype-handson-cli.s3-website-ap-northeast-1.amazonaws.com/handson_light-aws_service/handson_light-aws_service-ec2_vpc/index.html)
- JAWS-UG CLI専門支部：[ハンズオン(簡易版): EC2基礎 (インスタンス)](http://prototype-handson-cli.s3-website-ap-northeast-1.amazonaws.com/handson_light-aws_service/handson_light-aws_service-ec2_instance/index.html)
- JAWS-UG CLI専門支部：[ハンズオン(簡易版): EC2基礎 (EIP)](http://prototype-handson-cli.s3-website-ap-northeast-1.amazonaws.com/handson_light-aws_service/handson_light-aws_service-ec2_eip/index.html)
- JAWS-UG CLI専門支部：[ハンズオン(簡易版): EC2基礎 (EBS)](http://prototype-handson-cli.s3-website-ap-northeast-1.amazonaws.com/handson_light-aws_service/handson_light-aws_service-ec2_ebs/index.html)
- JAWS-UG CLI専門支部：[ハンズオン(簡易版): EC2基礎 (AMI)](http://prototype-handson-cli.s3-website-ap-northeast-1.amazonaws.com/handson_light-aws_service/handson_light-aws_service-ec2_ebs/index.html)
- JAWS-UG CLI専門支部：[ハンズオン(簡易版): EC2基礎 (セキュリティグループ)](http://prototype-handson-cli.s3-website-ap-northeast-1.amazonaws.com/handson_light-aws_service/handson_light-aws_service-ec2_security_group/index.html)