見出し画像

Pythonで作った天気情報取得アプリをAWS Lambda用にコンテナ化しました

天気情報取得アプリをPythonで実装したのでAWS Lambda用にコンテナ化しました。
Dockerコンテナのビルド後、ローカル環境での動作確認まで行いました。

Python コードの実装

以下のコードをhandler.pyとして実装します。このコードはLambda関数として動作させるもので、OpenWeatherMap APIから天気情報を取得します。

# handler.py
import json
import requests

def get_weather(api_key, location):
    url = f'https://api.openweathermap.org/data/2.5/weather?q={location}&appid={api_key}&units=metric'

    try:
        response = requests.get(url)
        response.raise_for_status()
        weather_data = response.json()

        temperature = weather_data['main']['temp']
        weather_description = weather_data['weather'][0]['description']

        return {
            'temperature': temperature,
            'description': weather_description
        }

    except requests.exceptions.RequestException as e:
        return {'error': str(e)}

def lambda_handler(event, context):
    api_key = 'YOUR_API_KEY'
    location = 'Naha,Okinawa,JP' # 天気情報を取得したい場所。値は外部から受け取れるように変更予定

    weather_info = get_weather(api_key, location)

    if 'error' in weather_info:
        return {
            'statusCode': 500,
            'body': json.dumps(weather_info)
        }

    return {
        'statusCode': 200,
        'body': json.dumps({
            'location': location,
            'temperature': weather_info['temperature'],
            'description': weather_info['description']
        })
    }

if __name__ == "__main__":
    lambda_handler(None, None)

Dockerfile の作成

次に、上記のコードをコンテナ化するためのDockerfileを作成します。

# Python 3.9 の AWS Lambda ベースイメージを使用
FROM public.ecr.aws/lambda/python:3.9

# アプリケーションコードをコンテナにコピー
COPY handler.py ${LAMBDA_TASK_ROOT}

# 必要な依存関係をインストール
RUN pip install --no-cache-dir requests

# Lambda 関数ハンドラを設定
CMD ["handler.lambda_handler"]

Dockerfileについてメモ

  • ベースイメージ: AWS Lambda用の公式Python 3.9イメージを使用しています。
    AWS Lambda Pythonランタイム

  • 依存関係のインストール: RUN pip install --no-cache-dir requestsはrequestsライブラリをインストールします。--no-cache-dirオプションでキャッシュを作成せず、イメージサイズを削減します。

--no-cache-dir オプションについてメモ

--no-cache-dirオプションは、パッケージのキャッシュを作成せずにインストールする設定です。以下のようなメリットがあるようです。

  • コンテナのサイズを削減: キャッシュが生成されないため、イメージサイズが小さくなるらしい。

  • クリーンなビルド: 常に最新のパッケージがインストールされ、古いバージョンの再利用を防ぐ。

Docker イメージのビルドと実行

以下のコマンドでDockerイメージをビルドし、実行します。

# Docker イメージのビルド
docker build -t weather-checker .

コマンドについてメモ

  • `docker build -t weather-checker .`:

    • `docker build`: Dockerイメージをビルドするコマンドです。

    • `-t weather-checker`: ビルドするイメージに「weather-checker」という名前を付けます。

    • `.`: 現在のディレクトリにあるDockerfileを使ってビルドを行います。

# コンテナの起動
docker run -p 9000:8080 weather-checker

コマンドについてメモ

コンテナを実行するコマンドはこちらのドキュメントの`(オプション) イメージをローカルでテストする`を参考にしました。

[https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-image.html:embed:cite]

  • docker run: Dockerコンテナを起動するコマンドです。

  • -p 9000:8080: コンテナのポート8080をローカルのポート9000にマッピングします。

  • weather-checker: 起動するコンテナの名前です。ビルドしたイメージを指定しています。

コンテナ内の Lambda 関数をテスト

コンテナが起動したら、以下の`curl`コマンドでLambda関数をテストできます。

curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

上記を実行すると以下のレスポンスが返ってきて、コンテナが想定通り動作していることを確認できました。

コマンドの説明

まとめ

Lambda用のコンテナをビルドできたので、次はこのコンテナイメージを置くECRやその他必要なAWSリソースをTerraformで定義していきたいと思います。

いいなと思ったら応援しよう!