🙄

【2025年最新】AWSの通知 LINEに送信する方法

に公開

はじめに

AWSの通知を、個人のLINEで確認するための構築について説明します。
今回はAWS初学者向けに使用料金を通知する想定で説明しますが、
Budgets部分を変えることで他のサービスでも通知が可能です。

想定読者

  • AWS初学者の方
  • AWSの通知全般を個人LINEに通知したい方

構成図

処理概要

  1. 「Budgets」でコスト情報を取得
  2. 「SNS」でコスト情報を「Lambda」に通知
  3. 「Lambda」の処理開始
  4. 「Systems Manager Prameter Store」からLINEのAPI情報を取得
  5. 「公式LINE」へAPI情報を使用し通知
  6. 「Lambda」の処理終了
  7. 「公式LINE」を友達登録している個人LINEでメッセージ確認

サービス選定

下記2点について説明します。

LINE Developer

元々はLINE Notifyが使用されていたようですが、2025年3月でサービス終了しています。
LINE Messaging APIを使用するため、LINE DeveloperからAPI情報を取得します。

Systems Manager Prameter Store

API情報を保護するために使用しています。
AWS上で情報を保護するのにつかわれるサービスとして「Secrets Manager」があります。
今回は、どちらを使用するか悩みましたが下記理由から「Prameter Store」を選定しています。
■理由
外部API情報のため自動ローテーションができないため使用しません。
また、今回は無料で構成するため、Parameter Store(Standard)を使用しています。

項目 Parameter Store
(Standard/Advanced)
Secrets Manager
💰 使用料金(API呼び出し) - Standard: 無料
- Advanced: 10,000回/$0.05
10,000回/$0.05
💾 保存料金 - Standard: 無料
- Advanced: $0.05/月
$0.40/月(1シークレット)
🔄 ログローテート ❌ 非対応 ✅ 自動ローテーション対応
🔐 暗号化対応 ✅ AWS KMSで暗号化可能 ✅ AWS KMSで暗号化可能

費用

常に無料枠(Always Free)の範囲で完結します。
AWS 料金表

サービス名 料金 無料枠の内容
AWS Budgets 無料 基本機能は無料
Amazon SNS 無料 月 100 万件の API リクエストまで無料
AWS Lambda 無料 月 100 万リクエスト、320 万秒の実行時間まで無料
Systems Manager Parameter Store 無料 月 10,000 件の API リクエストまで無料
LINE Messaging API 無料 月 1,000 通まで無料
合計金額 無料 ※想定条件下ではすべて無料枠内に収まる

必要なもの

  • AWSアカウント
  • 通知を確認するLINE
  • 通知する公式LINE ※こちらについては、作成方法を記載しております。

LINE側手順

2025年7月に作成しています。
UIや文言が変更になってわからない場合は、下記公式ドキュメントを参照してください。
Messaging APIを始めよう
名前等は指定して進めますが、任意なので自身のお好きな名前等を入れて下さい。
変更してはいけない箇所は注意書きとして記載します。

1.公式LINEの作成

  1. LINE Businessにアクセス
    ログイン画面
  2. 「LINEアカウント」>「QRコードでログイン」の順にクリック
  3. 個人LINEで友達追加のQR読み込みを使用しログイン
  4. 左側のアカウントタブから「作成」をクリック
  5. アカウント情報を入力し、「確認」をクリック

  6. 入力内容の確認し「完了」をクリック
  7. 「LINE Official Account Managerへ」をクリック

2.Messaging API情報の確認

  1. 公式LINEの作成の7.で移動した画面右上の「設定」をクリック
  2. 設定から左の「Messaging API」をクリック
  3. 「Messaging APIを利用する」をクリック
  4. プロバイダーを作成の項目に「AWS」を入力し「同意する」をクリック
  5. プライバシーポリシーと利用規約で何も入力せず「OK」をクリック
  6. 情報を確認し「OK」をクリック
  7. LINE Developersコンソールへ移動
    LINE Developersコンソール
  8. 左のプロバイダーから「<使用するプロバイダー名>」をクリック
  9. 公式LINEの作成にて作成したアカウントをクリック
  10. Messaging API設定>チャネルアクセストークン(長期)から「発行」をクリック
  11. 下記でMessaging API情報の確認
  • アクセストークン:Messaging API設定>チャネルアクセストークン(長期)
  • ユーザーID   :チャンネル基本設定>あなたのユーザーID

AWS側リソース作成手順

名前等は指定して進めますが、任意なので自身のお好きな名前等を入れて下さい。
変更してはいけない箇所は注意書きとして記載します。

1.Prameter StoreへAPI情報保存

  1. 上部の検索から「パラメータストア」を入力しクリック
  2. 「パラメータを作成」 をクリック
  3. 下記画像の情報を入力して、「パラメータを作成」 をクリック
値コード
{
  "LINE_ACCESS_TOKEN": "<アクセストークン>",
  "LINE_USER_ID": "<ユーザーID>"
}

  1. ARNの確認

2.Lambdaの作成

  1. 上部の検索から「Lambda」を入力しクリック
  2. その他のリソースから「レイヤー」をクリック
  3. 「レイヤーを作成」をクリック
  4. 下記画像の情報を入力して、「作成」をクリック
requests-layerの説明

AWS LambdaでPythonのrequestsライブラリを使うためのレイヤー用ファイルです。
requestsライブラリは、Webサイトからデータを取得したりAPIに情報を送ったりできるライブラリです。


6. 上部の検索から「Lambda」を入力しクリック
7. 「関数の作成」をクリック
8. 下記画像の情報を入力して、「関数の作成」をクリック

9. コードタブに下記コードを貼り付け「deploy(Ctrl+Shift+U)」をクリック

コード
import boto3
import json
import requests
import logging
from typing import Tuple, Dict, Any

# ログレベルは WARNING に固定
logger = logging.getLogger()
logger.setLevel(logging.WARNING)

def get_line_credentials() -> Tuple[str, str]:
    """
    AWS Systems Manager Parameter StoreからLINEの認証情報を取得
    """
    ssm = boto3.client('ssm')
    response = ssm.get_parameter(Name='/line/MessagingAPI', WithDecryption=True)
    secret = json.loads(response['Parameter']['Value'])
    return secret['LINE_ACCESS_TOKEN'], secret['LINE_USER_ID']

def send_line_message(access_token: str, user_id: str, message: str) -> None:
    """
    LINE Messaging APIを使って指定ユーザーにメッセージを送信する
    """
    url = 'https://api.line.me/v2/bot/message/push'
    headers = {
        'Content-Type': 'application/json',
        'Authorization': f'Bearer {access_token}'
    }
    body = {
        'to': user_id,
        'messages': [{
            'type': 'text',
            'text': f'AWS通知:\n{message}'
        }]
    }

    try:
        response = requests.post(url, headers=headers, data=json.dumps(body))
        response.raise_for_status()
        logger.warning("LINE送信成功")
    except requests.exceptions.RequestException as e:
        logger.warning(f"LINE送信失敗: {response.status_code}")
        raise Exception("LINE APIエラーが発生しました") from e

def lambda_handler(event: Dict[str, Any], context: Any) -> None:
    """
    AWS Lambdaのエントリーポイント
    """
    try:
        # SNSイベントからメッセージを取得
        message = event['Records'][0]['Sns']['Message']

        # 認証情報の取得
        access_token, user_id = get_line_credentials()

        # LINEメッセージ送信
        send_line_message(access_token, user_id, message)

    except Exception:
        logger.error("Lambda処理中にエラーが発生しました")
        raise

  1. 上部に下記表示がされていれば更新されています。
  2. ARNの確認

3.SNSの作成

  1. 上部の検索から「Simple Notification Service」を入力しクリック
  2. トピック名を入力し「次のステップ」をクリック
  3. 下記情報で「トピックの作成」をクリック


4. ARNの確認

4.Budgetsの作成

  1. 上部の検索から「Budgets」を入力しクリック
  2. 「予算の作成」をクリック
  3. 下記画像の情報を入力して、「予算を作成」をクリック

AWS側サービスの連携

1.ポリシーの作成

  1. 上部の検索から「IAM」を入力しクリック
  2. 左のアクセス管理から「ポリシー」をクリック
  3. 「ポリシーを作成」をクリック
  4. 「JSON」をクリック
  5. ポリシーエディタに下記コードを入力し「次へ」をクリック
コード
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ParameterStoreAccess",
      "Effect": "Allow",
      "Action": [
        "ssm:GetParameter",
        "ssm:GetParameters"
      ],
      "Resource": "●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●"
    },
    {
      "Sid": "KMSDecryptAccess",
      "Effect": "Allow",
      "Action": "kms:Decrypt",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "kms:ViaService": "ssm.ap-northeast-1.amazonaws.com"
        }
      }
    },
    {
      "Sid": "CloudWatchLogsAccess",
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "*"
    },
    {
      "Sid": "SNSInvokeAccess",
      "Effect": "Allow",
      "Action": [
        "sns:Publish"
      ],
      "Resource": "*"
    }
  ]
}


6. ポリシー名を入力し「ポリシーの作成」をクリック

2.IAMロールの作成

  1. 左のアクセス管理から「ロール」をクリック
  2. 「ロールを作成」をクリック
  3. 下記画像の情報を入力して、「次へ」をクリック
  4. AWS側サービスの連携2.で作成したポリシーを選択し「次へ」をクリック
  5. ロール名を入力し、「ロールの作成」をクリック

3.Lambda設定

  1. 上部の検索から「Lambda」を入力しクリック
  2. AWS側リソース作成手順2.で作成したLambda名をクリック
  3. 「+ トリガーを追加」をクリック
  4. 下記画像の情報を入力して、「追加」をクリック


5. 「設定」>「一般設定」>「編集」の順にクリック

6. 下部にある既存のロールでロールを選択し「保存」をクリック

4.SNS設定

  1. 上部の検索から「Simple Notification Service」を入力しクリック
  2. 「トピック」>「トピック名」の順にクリック
  1. 「編集」をクリック
  2. アクセスポリシーに、下記を入力し「変更の保存」をクリック
コード
{
  "Sid": "AllowBudgetsToPublish",
  "Effect": "Allow",
  "Principal": {
    "Service": "budgets.amazonaws.com"
  },
  "Action": "SNS:Publish",
  "Resource": "●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●",
  "Condition": {
    "StringEquals": {
      "aws:SourceAccount": "123456789012"
    },
    "ArnLike": {
      "aws:SourceArn": "arn:aws:budgets::123456789012:*"
    }
  }
}

5.Budgets設定

  1. 上部の検索から「Budgets」を入力しクリック
  2. 「予算名」をクリック
  1. 右上の「編集」をクリック
  2. 下部の「次へ」をクリック
  3. 「▶Amazon SNS アラート - オプション」をクリック
  4. Amazon SNS ARN を選択に、AWS側リソース作成手順3.4.で確認したSNSのARNを入力
  5. 「次へ」をクリック
  6. 「次へ」をクリック
  7. 「保存」をクリック

テスト

  1. 上部の検索から「Simple Notification Service」を入力しクリック
  2. 「トピック」>「トピック名」の順にクリック
  1. 右上の「メッセージの発行」をクリック
  2. 下記画像の情報を入力して「メッセージの発行」をクリック
  3. LINE側手順1.で作成した公式LINEでメッセージが送信されるか確認

まとめ

この構成を応用すれば、AWSの通知をLINEに集約して管理できるようになると思います。
ぜひ、使用してみてください。
わかりずらいところ、うまくいかないなどがあれば、どんどんコメントで聞いていただければと思います。
また、アドバイス等もお待ちしております。
余談ですが、今回の構成で料金が超えると下記のように通知が飛びます。

独り言と今後の予定

今回は手順の順番や画像を入れるか入れないかなど、とても悩み疲れました💦
今後は手順少な目で書いていくかもしれません。

とりあえずZennを始める前に書きたかったことは、ひと段落しましたので
次回は、自己学習のためにIaCやTerraformについて情報をまとめようかと思います。

Discussion