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 '{}'
上記を実行すると以下のレスポンスが返ってきて、コンテナが想定通り動作していることを確認できました。
コマンドの説明
curl: コマンドラインでHTTPリクエストを送信するためのツールです。
-XPOST: HTTPメソッドとしてPOSTリクエストを指定します。
"http://localhost:9000/2015-03-31/functions/function/invocations": AWS Lambdaのリクエストを受け付けるエンドポイントのようです。
-d '{}': 空のJSONオブジェクト`{}`をリクエストボディとして送信します。
AWS Lambda コンテナイメージの使用
まとめ
Lambda用のコンテナをビルドできたので、次はこのコンテナイメージを置くECRやその他必要なAWSリソースをTerraformで定義していきたいと思います。