Skip to content

Amazon Connect コスト集計手順書

概要

本書は、Amazon Connectのコストを電話番号および対象キューに応じて費用按分するための月次集計手順を記載します。

背景・目的

  • 目的: 電話番号および対象キューに応じたAmazon Connectの費用按分
  • 背景: オンライン事業部でコスト集計をしていたが、SREでコストモニタリングをするため、SREで引き継いだ
  • 実施頻度: 毎月(月初から4日以内)
  • 用途: AWSの費用按分作業のための資料作成
  • 今後の展望: 完全自動化する(自動化まで本手順で対応する)

対象環境

  • システム: Amazon Connect(FDシステム)
  • AWSアカウントID: 913831226605
  • リージョン: 東京(ap-northeast-1)

前提条件

必要な権限・アクセス

AWS 913831226605アカウント

  • [ ] Amazon ConnectのRead権限
  • [ ] AWS CloudShellへのAdmin権限

GCP oc-monitoringプロジェクト

  • [ ] bigquery ジョブユーザー権限
  • [ ] bigquery データ編集者権限
  • [ ] bigquery ユーザー権限

Google Spreadsheet

  • [ ] Google Spreadsheetの編集権限
  • [ ] 前月のコストシートへの編集権限
必要なAWS IAM権限の内容(例)
json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "connect:ListQueues",
                "connect:DescribeQueue",
                "connect:ListPhoneNumbersV2",
                "connect:ListContactFlows",
                "connect:BatchGetFlowAssociation"
            ],
            "Resource": "arn:aws:connect:ap-northeast-1:913831226605:instance/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudshell:*"
            ],
            "Resource": "*"
        }
    ]
}

必要なツール

  • [ ] AWSコンソールへのアクセス
  • [ ] Google Spreadsheet
  • [ ] テキストエディタ(VSCode等)

注意事項

  • 作業は 月初から4日以内 に完了すること
  • 最終的なデータの整合性を必ず確認すること
  • CloudShellでの作業完了後は必ずセッションを終了する
  • ダウンロードしたCSVファイルは作業完了後に削除する
  • 機密情報を含むデータの取り扱いに注意する

作業時間見積もり

  • 作業: 約2-3時間

作業手順

1. 前月コストシートの複製

1.1 シートの複製

  1. 前月のシート(例: amazon connect_YYYY年MM月版)を複製
  2. 一時的にマイドライブに保存
    • 注意: 正規配置場所への移動は検討(TBD)
  3. 共有設定を前月シートと同じに設定

1.2 参照設定の修正

  1. 提出用シートのB列5行目 のRefで参照エラーを修正

    • セルを選択してアクセス許可を追加
  2. 詳細版提出用B,C列の4,5行目 の数式を修正

    • 数式内のスプレッドシートID(URLの/d/の/までの後の文字列)を今回更新するシートのIDに変更
  3. 詳細版提出用B列の5行目 の数式を修正

    • 上記2と同様にスプレッドシートIDを更新

2. 集計対象月へのリネーム

2.1 シート名の変更

  • シート名を集計対象月に変更

2.2 接続シートのクエリ修正

  1. 接続シート1〜5 のクエリを修正
  2. 検索範囲を集計対象月に変更
    • 注意: 権限エラーが発生した場合は、オンライン事業部のPMにプロジェクト oc-monitoring の権限追加を依頼する
  3. 抽出データ のシートの全てに対して画面左下に表示される青色の更新ボタンを押す

3. AWS CloudShellでのデータ取得

3.1 CloudShell起動

  1. AWSコンソールから913831226605アカウントにログイン
  2. 東京リージョン(ap-northeast-1) を選択
  3. CloudShellを起動

3.2 キューリスト取得

  1. キューIDを取得
bash
aws connect list-queues --instance-id dbdef82b-a066-4ad3-a9d1-1da163ccc52c > queues.json
  1. スタンダードキューのIDを抽出
bash
cat queues.json | jq -r '.QueueSummaryList[] | select(.QueueType == "STANDARD") | .Id' > queue_ids.txt
cat queue_ids.txt
  1. 重複を削除
bash
sort queue_ids.txt | uniq > unique_queue_ids.txt
wc -l unique_queue_ids.txt
  1. キュー詳細情報を取得

    コマンド
    bash
    echo "queue_name,description" > queues.csv
    # 合計件数取得
    total=$(wc -l < unique_queue_ids.txt)
    count=0
    while read -r queue_id; do
      count=$((count + 1))
      echo "Processing $count / $total: $queue_id"
      response=$(aws connect describe-queue --instance-id dbdef82b-a066-4ad3-a9d1-1da163ccc52c --queue-id "$queue_id" 2>/dev/null)
      if [ $? -ne 0 ]; then
        echo "Error retrieving queue details for ID: $queue_id" >&2
        continue
      fi
      echo "$response" | jq -r '[.Queue.Name, .Queue.Description // ""] | @csv' >> queues.csv
    done < unique_queue_ids.txt
  2. 結果確認

bash
cat queues.csv
  1. CSVファイルをソート
bash
# ヘッダーを抜き出して最上段に保存
head -n 1 queues.csv > sorted_queues.csv
# データ行だけソートして追記
tail -n +2 queues.csv | LC_ALL=C sort -t, -k1,1 >> sorted_queues.csv
# 結果確認
cat sorted_queues.csv
  1. CSVファイルをダウンロード
  • CloudShellの右上「アクション」メニューから、sorted_queues.csvをローカル環境にダウンロード
  • ダウンロードファイルパス:/home/cloudshell-user/sorted_queues.csv

3.3 電話番号/フロー取得

  1. 情報取得

    コマンド
    bash
    #!/bin/bash
    INSTANCE_ID="dbdef82b-a066-4ad3-a9d1-1da163ccc52c"
    REGION="ap-northeast-1"
    OUTPUT_FILE="connect_phone_summary.csv"
    # CSVヘッダー出力
    echo "\"Phone Number\",\"Description\",\"Phone Type\",\"Active Channels\",\"Contact flow/IVR\",\"Country\"" > "$OUTPUT_FILE"
    # Contact Flow ID → Name のマッピング
    declare -A FLOW_NAME_MAP
    while read -r FLOW_ID FLOW_NAME; do
      FLOW_NAME_MAP["$FLOW_ID"]="$FLOW_NAME"
    done < <(aws connect list-contact-flows \
      --instance-id "$INSTANCE_ID" \
      --region "$REGION" \
      --query 'ContactFlowSummaryList[*].[Id, Name]' \
      --output text)
    # list-phone-numbers-v2(TargetArnを用いた Voice 判定)
    aws connect list-phone-numbers-v2 \
      --instance-id "$INSTANCE_ID" \
      --region "$REGION" \
      --query 'ListPhoneNumbersSummaryList[*]' \
      --output json |
    jq -c '.[]' |
    while read -r row; do
      PHONE_ID=$(echo "$row" | jq -r '.PhoneNumberId')
      PHONE_NUM=$(echo "$row" | jq -r '.PhoneNumber')
      DESC=$(echo "$row" | jq -r '.PhoneNumberDescription // ""')
      TYPE=$(echo "$row" | jq -r '.PhoneNumberType // ""')
      COUNTRY=$(echo "$row" | jq -r '.PhoneNumberCountryCode // ""')
      # ✅ Active Channel:TargetArn が存在すれば Voice
      HAS_TARGET=$(echo "$row" | jq -r '.TargetArn')
      if [[ "$HAS_TARGET" != "null" && -n "$HAS_TARGET" ]]; then
        CHANNEL="Voice"
      else
        CHANNEL="-"
      fi
      # Flow 情報取得
      FLOW_ID=$(aws connect batch-get-flow-association \
        --instance-id "$INSTANCE_ID" \
        --region "$REGION" \
        --resource-type VOICE_PHONE_NUMBER \
        --resource-ids "$PHONE_ID" \
        --query "FlowAssociationSummaryList[0].FlowId" \
        --output text 2>/dev/null)
      if [[ "$FLOW_ID" != "None" && "$FLOW_ID" != "null" ]]; then
        FLOW_ID_SHORT="${FLOW_ID##*/}"
        FLOW_NAME="${FLOW_NAME_MAP[$FLOW_ID_SHORT]}"
        [[ -z "$FLOW_NAME" ]] && FLOW_NAME="(Unknown)"
      else
        FLOW_NAME="(Not Set)"
      fi
      # ✅ 出力(画面表示 + CSV追記)
      printf '"%s","%s","%s","%s","%s","%s"\n' \
        "$PHONE_NUM" "$DESC" "$TYPE" "$CHANNEL" "$FLOW_NAME" "$COUNTRY" | tee -a "$OUTPUT_FILE"
    done

以下のエラーが発生した場合の対処法:: CloudShellを閉じて、しばらく待ってから再実行

An error occurred (TooManyRequestsException) when calling the ListPhoneNumbersV2 operation (reached max retries: 2): Too Many Requests
  1. CSVファイルをダウンロード
  • CloudShellの右上「アクション」メニューから、connect_phone_summary.csvをローカル環境にダウンロード
  • ダウンロードファイルパス:/home/cloudshell-user/connect_phone_summary.csv

4. データの貼り付け・整理

4.1 キューリストの更新

  1. 「キューリスト」シートを開く
  2. A,B,C列 の色と太文字設定を元に戻す
  3. 取得したデータを F,G列 に貼り付け
  4. A,B列にはあるがF,G列にはなくFALSE判定でズレた場合: F,G列にセルを挿入して空白行にし次の行がTRUEになるまで揃える
  5. A,B列にないがF,G列にはありFALSE判定でズレた場合: A,B,C列にセルを挿入して空白行しF,G列と同じ内容を転記しA,B,C列を赤い太文字にする。
  6. category_queueが不明なものは 他のシートを参考に調べる。不明な場合はオンライン事業部のPMに確認する。

4.2 番号リストの更新

  1. データ前処理:

    • connect_phone_summary.csvに対してdescription部分に改行が入っていることがあるので改行を削除(以下のスクリプト使用)
    script
    bash
    #!/bin/bash
    INPUT_FILE="connect_phone_summary.csv"
    OUTPUT_FILE="connect_phone_summary_output.csv"
    
    # 出力ファイル初期化
    > "$OUTPUT_FILE"
    
    # ステップ1: 行頭に ' がなければ付けて、current_line に全行を読み込む
    current_line=""
    while IFS= read -r line || [ -n "$line" ]; do
      # 行頭に ' がなければ追加
      [[ $line != \'* ]] && line="'$line"
      current_line="${current_line}${line}"
    done < "$INPUT_FILE"
    
    # ステップ2: "JP" の直後に改行を挿入して、output.csv に出力
    echo "$current_line" | perl -pe 's/"JP"/"JP"\n/g' > "$OUTPUT_FILE"
  2. スプレッドシート更新:

    • 「番号リスト」シートのA,B,C列 の色と太文字設定を元に戻す
    • 処理済みデータを F列以降 に貼り付け
    • A,B列にはあるがF,G列にはなく不一致判定でズレた場合: F~P列にセルを挿入して空白行にし次の行がTRUEになるまで揃える
    • A,B列にないがF,G列にはあり不一致判定でズレた場合: A,B,C列にセルを挿入して空白行しF,G列と同じ内容を転記しA,B,C列を赤い太文字にする。

5. 詳細版の調整

5.1 X列の数値調整

  • 詳細版提出用シートのX列の2行目: 「番号リスト」シートでA,B,C列を更新し番号が増えた場合は保有回線数の数値を増やす

5.2 詳細版ソート処理

  1. 詳細版提出用 シートの全列6行目から下の値を全て 詳細版ソート シートの6行目に転記
  2. 詳細版ソート シートのR列を降順でソート

6. 作業完了連絡

6.1 オンライン事業部の担当者、アシスタントに連絡

  1. 以下の担当者にslackで完了連絡を入れる(2025/09時点の担当者)
  • オンライン事業部 伊藤勇樹
  • オンライン事業部 伊藤裕哉
  • アシスタント 伊藤園子

改版履歴

バージョン日付変更内容作成者
1.02025-09-04初版作成大賀
1.12025-10-02手順とスクリプト修正大賀