自動出力したソースコードの受け渡し用記事


### EC2とそのEBSの一覧取得
```
aws ec2 describe-instances \
    --query "Reservations[*].Instances[*].[InstanceId, Tags[?Key=='Name'].Value | [0], InstanceType, BlockDeviceMappings[*].Ebs.VolumeId, BlockDeviceMappings[*].DeviceName]" \
    --output text | awk '{
        instance_id=$1; name=$2; type=$3; device=$NF;
        for (i=4; i<=NF-1; i++) {
            volume_id=$(i);
            size=$(aws ec2 describe-volumes --volume-ids $volume_id --query Volumes[0].Size --output text);
            printf "%s\t%s\t%s\t%s\t%s\t%s\n", instance_id, name, type, volume_id, device, size;
        }
    }'
```

### 登録したメアドの中に検査用文字列があるか検査

```
# 検査用の文字列を定義
search_string = "example"

# 4つのメールアドレスを定義
email_addresses = [
    "user1@example.com",
    "user2@test.com",
    "admin@example.org",
    "contact@sample.com"
]

# フラグを初期化
flag = False

# メールアドレスのリストを検査
for email in email_addresses:
    if search_string in email:
        flag = True
        break  # 条件に合致するメールアドレスが見つかったらループを抜ける

# フラグが立っているか確認して後続処理を実行
if flag:
    print("検査用の文字列を含むメールアドレスが見つかりました。")
    # 後続処理
    print("後続の処理を実行中...")
else:
    print("検査用の文字列を含むメールアドレスは見つかりませんでした。")

```


### CSVを元にS3 Glacierからオブジェクトを復元／取得
なお、インプット情報となるCSVファイルは以下のフォーマットとする。
>mybucket01,mykey01
>mybucket02,mykey02
>mybucket03,mykey03
```
#!/bin/bash

# 入力CSVファイル
INPUT_CSV="/tmp/OldLogList.csv"

# ダウンロード先ディレクトリ
DOWNLOAD_DIR="/data/infra/shell/tmp/"

# ダウンロードディレクトリが存在しない場合は作成
mkdir -p "${DOWNLOAD_DIR}"

# CSVファイルを1行ずつ読み込み
while IFS=, read -r BUCKET_NAME OBJECT_KEY; do
    echo "date '+%Y/%m/%d %H:%M:%S' MSG001 Processing bucket: ${BUCKET_NAME}, object: ${OBJECT_KEY}"

    # ③ 復元リクエストを開始
    echo "date '+%Y/%m/%d %H:%M:%S' MSG002 Initiating restore request for ${OBJECT_KEY} in ${BUCKET_NAME}..."
    aws s3api restore-object \
        --bucket "${BUCKET_NAME}" \
        --key "${OBJECT_KEY}" \
        --restore-request '{"Days": 7, "GlacierJobParameters": {"Tier": "Standard"}}'

    # ④ 復元リクエストが完了したことを確認
    echo "date '+%Y/%m/%d %H:%M:%S' MSG003 Waiting for restore to complete..."
    while true; do
        RESTORE_STATUS=$(aws s3api head-object --bucket "${BUCKET_NAME}" --key "${OBJECT_KEY}" 2>&1 | grep -o '"Restore": "ongoing-request="false"' || true)
        if [[ ${RESTORE_STATUS} == *'"Restore": "ongoing-request="false"'* ]]; then
            echo "date '+%Y/%m/%d %H:%M:%S' MSG005 Restore completed for ${OBJECT_KEY}."
            break
        fi
        echo "date '+%Y/%m/%d %H:%M:%S' MSG004 Restore not yet completed. Waiting 1 minute..."
        sleep 60
    done

    # ⑤ 削除マーカーを除く最新のバージョンIDを取得
    VERSION_ID=$(aws s3api list-object-versions --bucket "${BUCKET_NAME}" --prefix "${OBJECT_KEY}" \
        | jq -r '
                ( .DeleteMarkers[] | select(.IsLatest == true) | .VersionId ) as $deleteMarkerId
                | .Versions[]
                | select(.VersionId != $deleteMarkerId)
                | .VersionId
                | . ' | head -n 1)

    echo "date '+%Y/%m/%d %H:%M:%S' MSG006 Latest version ID excluding delete marker: ${VERSION_ID}"

    # ⑥ オブジェクトをローカルにダウンロード
    echo "date '+%Y/%m/%d %H:%M:%S' MSG007 Downloading object ${OBJECT_KEY} (version: ${VERSION_ID}) to ${DOWNLOAD_DIR}..."
    aws s3api get-object --bucket "${BUCKET_NAME}" --key "${OBJECT_KEY}" \
        --version-id "${VERSION_ID}" "${DOWNLOAD_DIR}/${OBJECT_KEY}"

done < "${INPUT_CSV}"

echo "date '+%Y/%m/%d %H:%M:%S' MSG008 All tasks completed."
```



### Pythonでメールファイル(.eml)の送信者を取得
※ただしアカウント名とメールアドレスにより以下AやBのようになったりする
>A: Account \<Mail@Address\>
>B: Mail@Address
```
email_object = email.message_from_string(response)
senderaddr = email_object.get("From", None)
print(senderaddr)
```
ついでに、本文を変数body_textに取得した際、最期に改行が付いてきてしまうのが邪魔だったが、解決方法があったのでメモ↓↓↓
末尾に改行コードが含まれている場合、以下のreライブラリによる正規表現置換をすることで空文字に置換できる
```
import re
re.sub('\n$', '', body_text)
```

### Amazon EC2(RHEL)のリージョン情報取得
※ただし、元ネタはアベイラビリティゾーンの取得であることを理解しておくこと
```
curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//'
# 出力例：ap-northeast-1
```

### Amazon EC2(Windows)のリージョン情報取得
※ただし、元ネタはアベイラビリティゾーンの取得であることを理解しておくこと
```
(Invoke-RestMethod -Uri http://169.254.169.254/latest/meta-data/placement/availability-zone) -replace '.$'
```

### Microsoft SQL ServerのHA構成におけるプライマリレプリカの取得
```
#!/bin/bash

# 接続情報
SERVER="your_sql_server_host"
PORT="1433"
USERNAME="your_username"
PASSWORD="your_password"
DATABASE="master"

# クエリを実行してプライマリサーバを確認
PRIMARY_SERVER=$(sqlcmd -S ${SERVER},${PORT} -U ${USERNAME} -P ${PASSWORD} -d ${DATABASE} -h -1 -Q "SELECT primary_replica FROM sys.dm_hadr_availability_group_states" 2>/dev/null)

if [ -n "$PRIMARY_SERVER" ]; then
  echo "現在のプライマリサーバは: $PRIMARY_SERVER"
else
  echo "プライマリサーバ情報を取得できませんでした。"
fi

```