（備忘録）EC2インスタンスからのAWS CLIコマンド操作

# 1. はじめに
2020年5月5日に[ヤマムギ](https://yamamugi.connpass.com/)様主催にて開催された[ヤマムギ vol.9 (AWS)EC2からAWS CLIコマンドを実行してみようハンズオン](https://yamamugi.connpass.com/event/174795/)について、自分への備忘録としてまとめてみました。ご参考になれば幸いです。

# 2. 学んだ内容

- 検証環境の確認
- AWS CLIでのデフォルトリージョン設定
- AWS CLIからS3操作
- AWS CLIからEC2作成＆起動

# 3. 学習サイト

- [ヤマムギ vol.9 (AWS)EC2からAWS CLIコマンドを実行してみようハンズオン 手順](https://www.yamamanx.com/yamamugi-9-handson/)

# 4. 学習メモ

```shell:AWS-CLI
// デフォルトリージョンの設定（東京リージョンの場合）
// output formatは、json, text, tableが設定可能
$ aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: ap-northeast-1
Default output format [None]: json

// .configファイルの確認
$ cd
$ cat .aws/config
[default]
output = json
region = ap-northeast-1

// S3新規バケットの作成（AccessDeniedとなる場合はIAMロールにポリシー（"Action": "s3:CreateBucket"）が足りていない）
// BACKETNAMEの部分は世界で一意（ユニーク）になるように書き換えること
$ aws s3 mb s3://BACKETNAME
make_bucket: BACKETNAME

// S3バケット一覧の表示（AccessDeniedとなる場合はIAMロールにポリシー（"Action": "s3:ListAllMyBuckets"）が足りていない）
$ aws s3 ls

// EC2上のファイルをS3バケットにオブジェクトをアップロード
$ echo Hello > hello.html
$ aws s3 cp hello.html s3://BACKETNAME/hello.html
upload: ./hello.html to s3://BACKETNAME/hello.html

// S3アクセスコントロールリストの確認
$ aws s3api get-object-acl --bucket BACKETNAME --key hello.html
{
    "Owner": {
        "DisplayName": "accountname",
        "ID": "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "Grants": [
        {
            "Grantee": {
                "Type": "CanonicalUser",
                "DisplayName": "accountname",
                "ID": "xxxxxxxxxxxxxxxxx"
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}

// S3アクセスコントロールリストの設定
$ aws s3api put-object-acl --acl public-read --bucket BACKETNAME --key hello.html

// S3アクセスコントロールリストの確認
$ aws s3api get-object-acl --bucket BACKETNAME --key hello.html
{
    ~省略~
        {
            "Grantee": {
                "Type": "Group",
                "URI": "http://acs.amazonaws.com/groups/global/AllUsers"
            },
            "Permission": "READ"
        }
    ]
}

// S3オブジェクトの一覧表示
$ aws s3 ls s3://BACKETNAME

// S3オブジェクトの削除
$ aws s3 rm s3://BACKETNAME/hello.html
delete: s3://BACKETNAME/hello.html

// S3バケットの削除
$ aws s3 rb s3://BACKETNAME
remove_bucket: BACKETNAME

// EC2インスタンスの作成＆起動（image-idはリージョン毎にことなるため、リージョン毎のAMIを要確認）
// この例では、東京リージョンが.configに設定されている前提で、東京リージョンのAMIをimage-id指定している
$ aws ec2 run-instances --image-id ami-0f310fced6141e627 --instance-type t2.micro

// EC2インスタンスの確認
$ aws ec2 describe-instances
$ aws ec2 describe-instances --output=table --query 'Reservations[].Instances[].{InstanceId: InstanceId, PrivateIp: join(`, `, NetworkInterfaces[].PrivateIpAddress), GlobalIP: join(`, `, NetworkInterfaces[].Association.PublicIp), Platform:Platform, State: State.Name, SecurityGroupId: join(`, `, SecurityGroups[].GroupId) ,Name: Tags[?Key==`Name`].Value|[0]}'

// EC2インスタンスを終了＆削除（インスタンスID xxxxxxxxxxxxxxx は、EC2インスタンスのページから別途個別に調べておく必要あり。）
$ aws ec2 terminate-instances --instance-ids xxxxxxxxxxxxxxx
```

```shell:S3用のIAMロールポリシー
// BACKETNAMEの部分は、当該バケット名に書き換える必要あり

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:CreateBucket"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:DeleteBucket",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::BACKETNAME",
                "arn:aws:s3:::BACKETNAME/*"
            ]
        }
    ]
}
```

```shell:EC2用のIAMロールポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:TerminateInstances",
                "ec2:RunInstances"
            ],
            "Resource": "*"
        }
    ]
```

- 東京リージョンの場合のAmazonマシーンイメージ（AMI）に対するid名（image-id）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240522/ceec9f91-cd49-f755-0084-17a04a812423.png)


# 5. ハンズオンで得た豆知識

- S3バケット名は、世界で一意（ユニーク、重複不可）となるよう命名する必要あり。
- aws s3 lsコマンドがエラーとなる場合は、IAMロールポリシーのActionキーに"s3:ListAllMyBuckets"の値が設定されていないことが原因。
- Amazonマシーンイメージ（AMI）のid名（image-id）は、リージョン毎に異なる。

# 6. 参考サイト

- [利用できるリージョン](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions)

# 7. おわりに
AWS学習の参考になれば幸いです。
ハンズオン開催してくださいました[ヤマムギ](https://yamamugi.connpass.com/)様、感謝いたします。

2020/05/05 NISHIZONO Takahiro