リストファイルに記載したFQDNからcurlを実行して、レスポンス情報を記録するbashスクリプト


「どのCDNを使っているの？」 利用サービスの調べ方（3. レスポンスヘッダを確認して利用CDNを調べる）
https://www.stream.co.jp/blog/blogpost-41642/#3_CDN


大量のサイトからレスポンスコードやレスポンスヘッダ情報を取得することがあった。これはなかなか骨が折れる業務なので、[以前の記事](https://qiita.com/If_it_bleeds-we_can_kill_it/items/659be3b662f222907aea)で自動化などを行った。以前の記事だとレスポンスヘッダ情報などはなく、画面キャプチャだった。テキストベースで情報を記録するためにこれを作った。ログとしてレスポンス情報の結果をテキストとしてファイル出力するため、grep検索ができる。画面キャプチャだとそうはいかない。

# 前提
CloudShellで実施していますが、bashスクリプトのため、Linuxであれば一部修正するだけで対応可能。

# やり方
## スクリプトを作る
curl-sequence.shというファイル名で以下を作成。文字コードUTF-8、改行コードLFで保存。これをCloudShellにアップロードする。またはこれを直接CloudShellで作成する。
保存先はCloudShellのホームである「/home/cloudshell-user」。

```bash:curl-sequence.sh(UTF-8/LF)
#!/bin/bash

EXECDATE=`date "+%Y%m%d-%H%M-%S"`
HOMEDIR=/home/cloudshell-user
GRPNAME=$1
LISTNAME=$2

if [ $# -ne 2 ]; then
  echo "指定された引数は$#個です。" 1>&2
  echo "実行するには1個目の引数(任意ディレクトリ名)と、2個目の引数(リストファイル名)が必要です。" 1>&2
  exit 10
fi

ls -l ${HOMEDIR}/${LISTNAME} 
if [ $? != 0 ]; then
  echo "指定されたリストファイルがありません。" 1>&2
  exit 11
fi

ls -l ${HOMEDIR}/${GRPNAME}
if [ $? != 0 ]; then
  mkdir -p ${HOMEDIR}/${GRPNAME}
fi

WORKDIR=${HOMEDIR}/${GRPNAME}
LOG=${WORKDIR}/curl-sequence-result-${EXECDATE}.csv
CNM=","

touch ${LOG}
echo statuscode${CNM}url${CNM}via >> ${LOG}
while read row; do
  column1=`echo ${row} | cut -d , -f 1`
  column2=`echo ${row} | cut -d , -f 2`
  URL=${column1}://${column2}
  RESP=`curl -LI ${URL} -o /dev/null -w '%{http_code}\n' -s`
  VIA=`curl -LI ${URL} -s | grep -i via | cut -f 2 -d ":"`
  echo ${RESP}${CNM}${URL}${CNM}${VIA} >> ${LOG}
done < ${HOMEDIR}/${LISTNAME}
exit 0
```
<br>

処理概要
- ログファイル名に日付時刻を入れるため変数宣言
- 引数を変数に代入
- 引数の個数チェック
- 引数に記載するリストファイルの存在確認
- 引数で指定するグループ名ディレクトリの存在確認
  - ない場合はディレクトリを作成する
- ログディレクトリ名、ログファイル名の確定
- ログファイルの空ファイル作成
- ログファイル見出し行追記
- リストファイル読み込み（while）
  - 1列目、2列目をそれぞれ変数に代入
  - URL作成
  - HTTPレスポンスコード取得
  - HTTPレスポンスヘッダVia取得
  - ログファイルに書き込み
- 終了（exit0）

## リストファイルを作る
CSVで以下リストファイルを作成する。ここにレスポンスを記録するWebサイトのアドレス等を記載する。文字コードUTF-8、改行コードLFで保存。保存先はCloudShellのホームである「/home/cloudshell-user」。
URLの「://」がないのは、都合上そうなっている。スクリプトを改修すれば対応は可能。
```csv:curl-sequence-list.csv(UTF-8/LF)
https,aws.amazon.com/jp/console/
https,qiita.com/
http,www.ipa.go.jp/
https,www.ipa.go.jp/
```
上記のような形でhttpまたはhttpsを1列目に記載し、2列目にFQDNとディレクトリを記載する。

## スクリプト等ファイルの権限
```shell-session:cloudshell
[cloudshell-user ~]$ ls -l
-rw-rw-r-- 1 cloudshell-user cloudshell-user    91 Apr  3 14:20 curl-sequence-list.csv
-rw-rw-r-- 1 cloudshell-user cloudshell-user  1187 Apr  3 13:23 curl-sequence.sh
```
アップロードまたは作成時の既定で、特に変更不要。

## スクリプトの実行
```shell-session:cloudshell
[cloudshell-user ~]$ bash -uvx curl-sequence.sh test0403 curl-sequence-list.csv
```
<br>

「bash -uvx」はスクリプトの実行詳細を出すため、詳細を見たくない場合「-uvx」を消して実行する。
1つ目に引数に「test0403」とあるが、これはCloudShellのログ出力用のディレクトリを作成するためのディレクトリ名（ホームディレクトリにログが乱立するのを防ぐ）。
リストファイルに記載したURLを変えるときや、ログの出力ディレクトリを変えたい場合、「test0403」を任意お好きな名前に変える。

今回の場合、スクリプト実行後に「test0403」ディレクトリができる。
```shell-session:cloudshell
[cloudshell-user ~]$ ls -l
-rw-rw-r-- 1 cloudshell-user cloudshell-user    91 Apr  3 14:20 curl-sequence-list.csv
-rw-rw-r-- 1 cloudshell-user cloudshell-user  1187 Apr  3 13:23 curl-sequence.sh
drwxrwxr-x 2 cloudshell-user cloudshell-user  4096 Apr  3 14:20 test0403
```
<br>

このディレクトリの中にログが吐かれる。
```shell-session:cloudshell
[cloudshell-user ~]$ ls -l test0403/
-rw-rw-r-- 1 cloudshell-user cloudshell-user  402 Apr  3 14:20 curl-sequence-result-20230403-1420-20.csv
```
<br>

ログの中身を確認する。
```shell-session:cloudshell
[cloudshell-user ~]$ tail test0403/curl-sequence-result-20230403-1420-20.csv 
statuscode,url,via
200,https://aws.amazon.com/jp/console/, 1.1 0922677d7a4dc7dd73582b22ecc5c332.cloudfront.net (CloudFront)
200,https://qiita.com/,
 1.1 10885a2c24fad0ff660a4e3a8e3fb800.cloudfront.net (CloudFront)loudfront.net (CloudFront)
200,https://www.ipa.go.jp/, 1.1 894d29c67853637f82fa0660d3ebd3d8.cloudfront.net (CloudFront)
```

1列目がレスポンスコードの結果。2列目がcurlしたURL、3列目がレスポンスヘッダViaの値。この結果を見ると、AWSマネジメントコンソールと、いまリダイレクト設定ポロリ疑惑で話題の某PAさんも、Viaの情報からCloudFrontをCDNとして利用していることが推測できる。

※IP某さんの基本情報技術者試験は、模試で8割取得し、受験日当日の会場で受験票を忘れて以来、受けていない。I某Aもわたしも、誰でもうっかりミス、ポロリはある。

`http://www.ipa.go.jp/`の部分は、httpからhttpsへのリダイレクトが走っているため結果がViaしかでていない。エラーではないが、レスポンスコード300系は出るようには修正したいところではある。将来的に対応できるよう、chatgpt先生とリファクタリングを要相談。

# 他
必ずしもレスポンスヘッダのViaだけにCDN情報書かれているわけではないため、必要な情報などに応じてcurlコマンドの部分をリファクタリングしていく。

【備忘録】ちゃんとCDNからページが配信されているか確認する方法
https://0115765.com/archives/3877

> 結果にX-が付いていたりX-FastlyのようにCDNプロバイダ名が書かれてあったらOKです。ちゃんと配信されています。