🌦️

AWSハンズオン:OpenWeather API連携で天気通知SlackBotを作ってみた

に公開

AWS使ったことないのでAWSを使うような何かを作りたかったので定期実行をAWSで実装したslackbotを作ってみた

使用技術

  • 言語・ライブラリ:Python 3.10、requests
  • 外部 API:OpenWeatherMap(Current Weather + Geocoding)
  • クラウド:AWS Lambda + EventBridge + IAM + CloudWatch Logs
  • Slack 通知:Incoming Webhook

準備

  1. Slack Incoming Webhook

    • Slack API で App 作成 → Incoming Webhook を有効化
    • 投稿先チャンネルを選択して Webhook URL をメモ
  2. OpenWeatherMap API

ローカルで実装

ローカル環境構築

以降venvの中で操作する
(venv)ってターミナルにつく

# プロジェクトディレクトリ作成
mkdir weather-slackbot && cd weather-slackbot

# Python 仮想環境を作成・有効化
python3 -m venv venv
source venv/bin/activate

# 必要ライブラリをインストール
pip install requests

コード実装

今回は福岡で実装
都市から直接weahter取得することもできるが非推奨だったので一度緯度経度を取得してそれを渡すようにする

lambda_functions.py
import os
import requests

# 環境変数から取得
OPENWEATHER_API_KEY = os.environ['OPENWEATHER_API_KEY']
SLACK_WEBHOOK_URL   = os.environ['SLACK_WEBHOOK_URL']

def lambda_handler(event, context):
    # 1. ジオコーディングで福岡の緯度経度を取得
    geo_resp = requests.get(
        'https://api.openweathermap.org/geo/1.0/direct',
        params={'q':'Fukuoka,jp','limit':1,'appid':OPENWEATHER_API_KEY}
    )
    geo_resp.raise_for_status()
    geo_data = geo_resp.json()
    if not geo_data:
        raise RuntimeError('ジオコーディングで位置が見つかりませんでした')
    lat, lon = geo_data[0]['lat'], geo_data[0]['lon']

    # 2. 取得した緯度経度で天気データを取得
    weather_resp = requests.get(
        'https://api.openweathermap.org/data/2.5/weather',
        params={
            'lat': lat, 'lon': lon,
            'units': 'metric', 'lang': 'ja',
            'appid': OPENWEATHER_API_KEY
        }
    )
    weather_resp.raise_for_status()
    data = weather_resp.json()

    # 3. Slack 通知用メッセージを整形
    city    = data.get('name', '不明な都市')
    weather = data['weather'][0]['description']
    temp    = data['main']['temp']
    message = (
        f":sun_with_face: *{city} の朝の天気* :sun_with_face:\n"
        f"> 天気:{weather}\n"
        f"> 気温:{temp} ℃"
    )

    # 4. Slack に POST
    slack_resp = requests.post(SLACK_WEBHOOK_URL, json={'text': message})
    slack_resp.raise_for_status()

    return {'statusCode': 200, 'body': 'OK'}

if __name__ == '__main__':
    lambda_handler({}, {})

ローカル動作確認

## 環境変数を設定
export OPENWEATHER_API_KEY="YOUR_API_KEY"
export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/XXXX/XXXX/XXXX"

## スクリプトを実行
python3 lambda_function.py

このようにslackに通知が来たら成功

AWSにあげて定期実行させる

デプロイ用zipパッケージの作成

# 依存一覧を出力
pip freeze > requirements.txt

# package ディレクトリを用意
rm -rf package && mkdir package

# 依存ライブラリを package/ にインストール
pip install -r requirements.txt -t package/

# スクリプトをコピー
cp lambda_function.py package/

# ZIP 化
cd package
zip -r ../weather-slackbot.zip .
cd ..

AWSの設定

AWS サービスと、それぞれの役割・必要性まとめ
  1. AWS Lambda
    製品説明

    • サーバーレスでコードを実行できるコンピューティングサービス。

    • サーバーのプロビジョニングやスケーリングの管理が不要。

    • 任意のタイミング/イベントで自動的に起動し、処理が終わると停止する。

    今回の用途・必要性

    • 天気取得+Slack 通知ロジック を Python で記述し、毎回専用サーバーを立てずに実行したい。

    • 実行頻度も「毎朝1回」と少ないため、常時稼働させるのは非効率。

    • 実行時間が短く、利用量も無料枠内に収まるため、コストを抑えつつ安定運用できる。


  1. Amazon EventBridge(旧 CloudWatch Events)
    製品説明

    • 様々な AWS サービスやカスタムアプリケーションからのイベントをルールに従って受け取り、指定ターゲット(Lambda、Step Functions、SNS など)に転送できるイベントバス。

    • スケジュール(Cron/Rate)ルールもサポート。

    今回の用途・必要性

    • 毎朝 7:00(UTC=前日22:00)に Lambda を自動起動 するために使用。

    • 定期実行の設定が容易で、複雑なジョブスケジューラーを用意する必要がない。

    • 実行回数も年間数百回程度のため、無料枠内でまかなえる。


  1. AWS IAM(Identity and Access Management)
    製品説明

    • AWS リソースへのアクセス制御を行うサービス。

    • ユーザーやロール単位で、細かい権限ポリシーを設定可能。

    今回の用途・必要性

    • Lambda に最低限の実行権限(CloudWatch Logs 出力権限など)を与えるために専用の 実行ロール(IAM ロール) を作成。

    • 必要以上の権限を付与せず、セキュアな環境を担保。

IAM ロール作成(Lambda 実行ロール)

  1. AWS コンソール → IAMロールロールを作成
  2. ユースケースの選択Lambda
  3. アクセス権限の追加AWSLambdaBasicExecutionRole ポリシーをアタッチ
  4. ロール名lambda-weather-slackbot-role

Lambda 関数作成

  1. AWS コンソール → Lambda関数の作成
  2. 関数名weather-slackbot
  3. ランタイムPython 3.9 または Python 3.10
  4. 実行ロールlambda-weather-slackbot-role を選択
  5. コードソースweather-slackbot.zip をアップロード
  6. 環境変数
    • OPENWEATHER_API_KEY = あなたの OpenWeather API キー
    • SLACK_WEBHOOK_URL = あなたの Slack Webhook URL

EventBridge ルール(Scheduler)

  1. AWS コンソール → EventBridgeルールを作成
  2. ルールタイプスケジュール
  3. Cron 式: cron(0 22 * * ? *)
  4. ターゲット:Lambda 関数 weather-slackbot
  5. 実行ロール:「このリソースについて 新しいロールを作成」 を選択

まとめと振り返り

  • AWS のサーバーレス

    • Lambda でサーバー管理いらず、EventBridge でスケジュール実行が簡単
    • IAM ロールで細かく権限を制御できる
  • 手を動かして理解する大切さ

    • ドキュメントだけではわかりにくい設定(Cron 式やロールの紐づけ)も、実際に試してみるとスッと腹落ち
    • エラーやトラブルもデバッグログ → CloudWatch Logs → コンソールのモニタリングで解決
  • Cron(UTC⇔JST)に注意

    • UTC 表示に惑わされず、常に日本時間に直して確認
    • テスト用の短期スケジュール設定で動作検証を必ず行う
  • 仮想環境(venv)と依存管理

    • ローカルで動く環境を整えてからデプロイパッケージを作成
    • pip install -t を使うと ZIP に必要なライブラリを一発でまとめられる

Discussion