[AWS]コマンドラインからVPCを作成してみよう！その3[AWSCLI]


最近友人ととても良いお肉を食べました。
その際「高級肉は耐えごたえあるからレストランだと少量でてくるんだ」とかいう豆知識を聞きましたが・・・
本当だと思った。
油が強すぎて全然たべれない。
年・・・なんですかね。

日々老いを感じています。吉田です。

---

ようやくインスタンス立てますよ！
気づいたら３回目ですが今回で完成です！

**今回のやること**
1. キーペアの作成
2. セキュリティグループの作成
3. インスタンスを立てる！

#1. キーペアの作成
キーペアに関してはマネジメントコンソールからやったほうが良いかも。と個人的には思いました。

###[create-key-pair]コマンド
必要オプションは一つだけ
> --key-name

ただし一点注意が必要です。
このコマンドを実行すると標準出力（JSON形式）で秘密鍵の情報が帰ってきます。
マネジメントコンソールで作った時みたいにダウンロードができるとかそういったことはないので自分でファイルに書き出す必要があります。
標準出力される内容は、鍵情報以外にも
- KeyName
- KeyFingerprint
が含まれます。
つまりこんな感じです。

```json:Kye.pem

{
    "KeyMaterial": "RSA PRIVATE KEY", 
    "KeyName": "hogehogeKey", 
    "KeyFingerprint": "nagaimojiretu"
}

```
必要な情報は”KeyMaterial”の値である ***RSA PRIVATE KEY*** に該当する部分です。

-----BEGIN RSA PRIVATE KEY-----　から　-----END RSA PRIVATE KEY-----　までをファイルに書き出し実行権限を与えてください。

---

_余談_

```bash:サンプル
aws ec2 create-key-pair --key-name ./hogehogeKey | jq -r '.KeyMaterial' >> ./hogehogeKey.pem

```
「jq」が使えれば、こんな感じにしてあげると必要な情報だけをファイルに書き出せます。
あとは実行権限をつけてあげれば使えますね。

---

#2. セキュリティグループの作成

###[create-security-group]コマンド
セキュリティ・グループを作成するコマンド

|    オプション　|     意味 　　　| 何を書けばいいか |
|:-------------|:--------------|:--------------|
| --group-name | SGの名前　　　　| hogehogeSG |
|  --description | SGの説明　　　| "My hogehogeSG" |
|　--vpc-id     | VPCを明示的に指定する　| vpc-xxxxxxxx | 

```bash:サンプル
 aws ec2 create-security-group --group-name hogehogeSG --description "My hogehogeSG"
```

```json:表示
{
    "GroupId": "sg-xxxxxxxx"
}
```
このidあとで何回か使います。

---

###[authorize-security-group-ingress]コマンド
_なげぇよ・・・_
> authorize:（権威などを）与える
> ingress:入り口...security-group-ingress
> egress:出口...security-group-egress

長いだけです。
inboundルールとoutboundルールの編集を行います。
ええ、本当にいつも通り（マネジメントコンソールでやってる）の手順ですね。

|    オプション　|     意味 　　　| 何を書けばいいか |
|:-------------|:--------------|:--------------|
| --group-id  | 設定するSGをidで指定 | sg-xxxxxxxx |
| --protocol | プロトコルを選択 | tcp / udp |
| --port | 穴を開けるポート | 22,80,8080とか 1010-2020 みたいな|
| --cidr | 通信を許可するIPの範囲 | 0.0.0.0/0 = anywhere |
|  --source-group | セキュリティグループで指定　|　sg-xxxxxxxx　|

```bash:サンプル
 aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 22 --cidr 0.0.0.0/0

```
***やっぱなげぇよ！＼(＞ヮ＜)／***

コマンドが成功しても何も返されません。
できているか確認してみましょう。

```bash:サンプル
aws ec2 describe-security-groups --group-ids sg-xxxxxxxx
```

```json:表示（一部抜粋）

{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
            
            ], 
            "Description": "" 
            "IpPermissions": [
                {
                    "ToPort": 22, 
                    "IpProtocol": "tcp", 
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ], 
                    "UserIdGroupPairs": [], 
                    "FromPort": 22
                }
            ], 
            "GroupName": "hogehogeSG", 
            "VpcId": "vpc-xxxxxxxx", 
            "OwnerId": "xxxxxxxxxxxx", 
            "GroupId": "sg-xxxxxxxx"
        }

```
inboundだけです。長くなるので。
適宜整形して確認してください。

他にも穴を開ける必要がある際は都度 _[authorize-security-group-ingress]_ コマンドを実行してください。

---

##追記
***パブリックIPを自動で振る設定***
現在はパブリックIPが自動で振られていないのでその設定をしておきます。

```bash:サンプル
aws ec2 modify-subnet-attribute --subnet-id subnet-xxxxxxxx --map-public-ip-on-launch
```
> --map-public-ip-on-launch

このオプションを設定することでインスタンスを立てるときにパブリックIPが振られます。

--

#3. インスタンスを立てる！
_やっとインスタンスを立てるところまできました！お待ちかねのEC2です！_

---

***注意***
今回はami-idを事前にマネジメントコンソール上で確認しています。
コマンドで確認しても良いのですがさすがにめんどくさすぎるで・・・
今回使用するAIM−id： ***ami-5e842b5e*** (AmasonLinuxです)

---


###[run-instances]コマンド
オプションすごい多いです。
最小限、使うのだけ行きます。
サンプルコマンドを適時自分の環境に合わせて修正し、実行してください。


|    オプション　|     意味 　　　| 何を書けばいいか |
|:------------|:------------|:------------|
| --image-id | 使用するAMIを指定します | ami-xxxxxxxx |
| --count | 同一のインスタンスを何台立てるか指定します | 数字 |
| --instance-type | インスタンスタイプを指定 | t2.micro　など |
| --key-name | 秘密鍵の名前を指定 | キーペア名 |
| --security-group-ids | 使用するSG（複数可） | sg-xxxxxxxx sg-aaaaaaaa |
| --subnet-id | インスタンスを立てるサブネットを指定 | subnet-xxxxxxxx |

```bash:サンプル
aws ec2 run-instances --image-id ami-5e842b5e --count 1 --instance-type t2.micro --key-name hogehogeKey --security-group-ids sg-xxxxxxxx --subnet-id subnet-xxxxxxxx

```

どうでしょう？
難しい、敷居が高い！と思いがちなcliですが慣れてくるとそこまで難しくないですよね？
helpコマンドや公式リファレンスを見れば大抵のことはわかると思います。
今後もCLIのネタはどんどん投稿していきますのでお楽しみに〜



---
最後にインスタンスを立てた（成功した）際の結果をのっけておきます。
こんな感じのが帰って来たら無事成功です。

---

```json:表示
{
    "OwnerId": "xxxxxxxxxxxx", 
    "ReservationId": "r-xxxxxxxx", 
    "Groups": [], 
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            }, 
            "PublicDnsName": null, 
            "RootDeviceType": "ebs", 
            "State": {
                "Code": 0, 
                "Name": "pending"
            }, 
            "EbsOptimized": false, 
            "LaunchTime": "2015-07-16T01:55:02.000Z", 
            "PrivateIpAddress": "10.0.1.xxx", 
            "ProductCodes": [], 
            "VpcId": "vpc-xxxxxxxx", 
            "StateTransitionReason": null, 
            "InstanceId": "i-xxxxxxxx", 
            "ImageId": "ami-5e842b5e", 
            "PrivateDnsName": "ip-10-0-1-xxx.ap-northeast-1.compute.internal", 
            "KeyName": "hogehogetKey", 
            "SecurityGroups": [
                {
                    "GroupName": "hogehogeSG", 
                    "GroupId": "sg-xxxxxxxx"
                }
            ], 
            "ClientToken": null, 
            "SubnetId": "subnet-xxxxxxxx", 
            "InstanceType": "t2.micro", 
            "NetworkInterfaces": [
                {
                    "Status": "in-use", 
                    "MacAddress": "***********", 
                    "SourceDestCheck": true, 
                    "VpcId": "vpc-xxxxxxxx", 
                    "Description": null, 
                    "NetworkInterfaceId": "eni-xxxxxxxx", 
                    "PrivateIpAddresses": [
                        {
                            "Primary": true, 
                            "PrivateIpAddress": "10.0.1.xxx"
                        }
                    ], 
                    "Attachment": {
                        "Status": "attaching", 
                        "DeviceIndex": 0, 
                        "DeleteOnTermination": true, 
                        "AttachmentId": "eni-attach-xxxxxxxx", 
                        "AttachTime": "2015-07-16T01:55:02.000Z"
                    }, 
                    "Groups": [
                        {
                            "GroupName": "hogehogeSG", 
                            "GroupId": "sg-xxxxxxxx"
                        }
                    ], 
                    "SubnetId": "subnet-xxxxxxxx", 
                    "OwnerId": "************", 
                    "PrivateIpAddress": "10.0.1.xxx"
                }
            ], 
            "SourceDestCheck": true, 
            "Placement": {
                "Tenancy": "default", 
                "GroupName": null, 
                "AvailabilityZone": "ap-northeast-1c"
            }, 
            "Hypervisor": "xen", 
            "BlockDeviceMappings": [], 
            "Architecture": "x86_64", 
            "StateReason": {
                "Message": "pending", 
                "Code": "pending"
            }, 
            "RootDeviceName": "/dev/xvda", 
            "VirtualizationType": "hvm", 
            "AmiLaunchIndex": 0
        }
    ]
}

```