(自分にとって)ちょっと便利なTips(随時追記)

ここにはちょっとした自分用のTipsを記載していきます。
少しでも誰かのお役に立てば幸いです！
***
- `ntpq -p`をchronyで実現したい時  
`chronyc sources`

***
- terraformでどうしてもピンポイントで更新がしたい時(本当は有っちゃいけないけれども！)  
`terraform plan -target=resource` /  `terraform apply -target=resource`

```
$ terraform plan -target=aws_instance.test
$ terraform apply -target=aws_instance.test
```
***
- linuxやmacでファイルの文字コード情報を手軽に知りたいとき  
`file --mime ファイル名` (--mimeオプションでMIME typeとMIME encodingがわかる)

```
$ file --mime test.yaml
test.yaml: text/plain; charset=utf-8
$ file --mime test.txt
test.txt: text/plain; charset=us-ascii
$ file --mime test.md
test.md: text/plain; charset=utf-8
```
***
- Powershellコマンドでwgetと同様の内容を実現する  
`invoke-webrequest -Uri "ゲットしたいオブジェクトのパス" -outfile 出力するファイル名`  
`curl "url" -o 出力ファイル` と同じですね。  
Powershellからの戻り値はないので、出力ファイルのディレクトリでファイルの存在確認をしましょう。

```powershell
PS C:\Users\Administrator> echo "list volume" | diskpart

Microsoft DiskPart version 10.0.17763.1

Copyright (C) Microsoft Corporation.
On computer: DAERPAPL1

DISKPART>
  Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
  Volume 0     C   OS           NTFS   Partition     79 GB  Healthy    System
  Volume 1     D   APP          NTFS   Partition    119 GB  Healthy
  Volume 2     W   Work         NTFS   Partition     99 GB  Healthy

DISKPART>
PS C:\Users\Administrator>
```



- Powershellコマンドでwgetと同様の内容を実現する  
`invoke-webrequest -Uri "ゲットしたいオブジェクトのパス" -outfile 出力するファイル名`  
`curl "url" -o 出力ファイル` と同じですね。  
Powershellからの戻り値はないので、出力ファイルのディレクトリでファイルの存在確認をしましょう。

```powershell
PS C:\Users\hoge\Desktop\dl_files> invoke-webrequest -Uri "https://aws-quickstart.s3.amazonaws.com/quickstart-sap-s4-hana/submodules/quickstart-aws-vpc/templates/aws-vpc.template" -outfile aws-vpc.template

PS C:\Users\hoge\Desktop\dl_files> pwd

Path
----
C:\Users\hoge\Desktop\dl_files

PS C:\Users\hoge\Desktop\dl_files> get-childitem

    ディレクトリ: C:\Users\hoge\Desktop\dl_files

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2019/12/01     10:17         138098 aws-vpc.template
```



***
- インスタンスにアタッチされたセキュリティグループと"Name"タグをtext形式で取得  
`aws ec2 describe-instances --query Reservations[].Instances[*].{SG:SecurityGroups[*].GroupName,NAME:Tags[?Key==`Name`].Value} --output text`

```bash:sample
$ aws ec2 describe-instances --query "Reservations[].Instances[*].{SG:SecurityGroups[*].GroupName,NAME:Tags[?Key==`Name`].Value}" --output text
NAME    EC2-01
SG      admin-sg
SG      user-sg
NAME    EC2-02
SG      user-sg
SG      bastion-sg
・  
・  
・  

```


***
- 指定したインスタンスIDの稼働状況及びステータスチェック状態を取得  
`aws ec2 describe-instance-status --instance-ids インスタンスID1 インスタンスID2 ... --query "InstanceStatuses[].{InstanceId:InstanceId,Status:InstanceState.Name,SystemStatusChecks:SystemStatus.Details[].Status,InstanceStatusChecks:InstanceStatus.Details[].Status}"`

```bash:sample
$ aws ec2 describe-instance-status --instance-ids Instance_id1 Instance_id2 --query "InstanceStatuses[].{InstanceId:InstanceId,Status:InstanceState.Name,SystemStatusChecks:SystemStatus.Details[].Status,InstanceStatusChecks:InstanceStatus.Details[].Status}"
[
    {
        "InstanceId": "Instance_id1",
        "Status": "running",
        "InstanceStatusChecks": [
            "passed"
        ],
        "SystemStatusChecks": [
            "passed"
        ]
    },
    {
        "InstanceId": "Instance_id2",
        "Status": "running",
        "InstanceStatusChecks": [
            "passed"
        ],
        "SystemStatusChecks": [
            "passed"
        ]
    }
]
```

***
- サブネットIDを複数指定した形でインスタンスのタグ(Name)とプライベートアドレスを取得  
`aws ec2 describe-instances --filters "Name=network-interface.subnet-id,Values=サブネットID1,サブネットID2....." --query 'Reservations[].Instances[*].{IP:PrivateIpAddress,NAME:Tags[?Key==`Name`].Value}'`

```bash:sample
$ aws ec2 describe-instances --filters "Name=network-interface.subnet-id,Values=subnet-1,subnet-2,subnet-3,subnet-4" --query 'Reservations[].Instances[*].{IP:PrivateIpAddress,NAME:Tags[?Key==`Name`].Value}'
[
    [
        {
            "IP": "10.0.2.100",
            "NAME": [
                "Instance Name0"
            ]
        }
    ],
    [
        {
            "IP": "10.0.2.109",
            "NAME": [
                "Instance Name1"
            ]
        }
    ],
    [
        {
            "IP": "10.0.4.29",
            "NAME": [
                "Instance Name2"
            ]
        }
    ],
    [
        {
            "IP": "10.0.1.89",
            "NAME": [
                "Instance Name3"
            ]
        }
    ],
    [
        {
            "IP": "10.0.1.248",
            "NAME": [
                "Instance Name4"
            ]
        }
    ],
    [
        {
            "IP": "10.0.3.211",
            "NAME": [
                "Instance Name5"
            ]
        }
    ]
]
```

***
- セキュリティグループへのルール設定一括変更  

```bash:sample
# for文用のリスト
list='XXX.XXX.XXX.XXX/32
XXX.XXX.XXX.XXX/32
XXX.XXX.XXX.XXX/32
XXX.XXX.XXX.XXX/32
XXX.XXX.XXX.XXX/32
XXX.XXX.XXX.XXX/32'

# セキュリティグループへの許可ルールの追加
for x in $list; 
do echo "==== $x ===="; 
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxx --protocol tcp --port XX --cidr $x; 
echo ; 
done

# セキュリティグループからの許可ルールの削除
for x in $list; 
do echo "==== $x ===="; 
aws ec2 revoke-security-group-ingress --group-id sg-xxxxxx --protocol tcp --port XX --cidr $x; 
echo ; 
done

# まとめてセキュリティグループにルール(説明付き)で登録する場合
# 区切り文字を改行のみに設定
IFS=$'\n' 

# for文用のリスト
list='CidrIp=XXX.XXX.XXX.XXX/32,Description="XXXXXXX"
CidrIp=XXX.XXX.XXX.XXX/32,Description="XXXXXXX"
CidrIp=XXX.XXX.XXX.XXX/32,Description="XXXXXXX"
CidrIp=XXX.XXX.XXX.XXX/32,Description="XXXXXXX"
CidrIp=XXX.XXX.XXX.XXX/32,Description="XXXXXXX"'

# セキュリティグループへの許可ルールの追加(説明付き)
for x in $list; 
do echo "==== $x ===="; 
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxx --ip-permissions IpProtocol=tcp,FromPort=XX,ToPort=XX,IpRanges="[{$x}]" --profile XXXXXX; 
echo ; 
done
```

***

- Amazon Linux 2 の最新AMI取得ワンライナー  
  - ebs/gp2混在で一番最新なAMIを取得  
`aws ec2 describe-images --owner amazon --filters 'Name=name,Values=amzn2-ami-hvm-2.0.20*'  --query 'Images[].[Name, ImageId]' --output text | sort -nr | head -n 1`

  - ebsで一番最新なAMIを取得  
`aws ec2 describe-images --owner amazon --filters 'Name=name,Values=amzn2-ami-hvm-2.0.20*-ebs'  --query 'Images[].[Name, ImageId]' --output text | sort -nr | head -n 1`

  - gp2で一番最新なAMIを取得  
`aws ec2 describe-images --owner amazon --filters 'Name=name,Values=amzn2-ami-hvm-2.0.20*-gp2'  --query 'Images[].[Name, ImageId]' --output text | sort -nr | head -n 1`

```bash:sample
$ aws ec2 describe-images --owner amazon --filters 'Name=name,Values=amzn2-am
i-hvm-2.0.20*'  --query 'Images[].[Name, ImageId]' --output text | sort -nr | head -n 1
amzn2-ami-hvm-2.0.20190115-x86_64-gp2   ami-0d7ed3ddb85b521a6

$ aws ec2 describe-images --owner amazon --filters 'Name=name,Values=amzn2-am
i-hvm-2.0.20*-ebs'  --query 'Images[].[Name, ImageId]' --output text | sort -nr | head -n 1
amzn2-ami-hvm-2.0.20190115-x86_64-ebs   ami-08a596b640f31f62c

$ aws ec2 describe-images --owner amazon --filters 'Name=name,Values=amzn2-ami-hvm-2.0.20*-gp2'  --query 'Images[].[Name, ImageId]' --output text | sort -nr | head -n 1
amzn2-ami-hvm-2.0.20190115-x86_64-gp2   ami-0d7ed3ddb85b521a6
```