AWS Lambdaを使って天気情報を取得するためのコードを書いた
AWS Lambdaを使用して天気情報を取得するツールを構築しようとしています。
天気情報は、OpenWeatherMap APIを使って取得し、Lambda関数で処理したいと思います。
この記事では、実装した内容と今後の課題についてまとめます。
ローカル環境での開発とテスト
まずは、ローカル環境でPythonを使い、APIキーを使って天気情報を取得するコードを書きました。
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 = 'API_KEY'
location = '天気情報を取得したい場所'
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)
実装時に調査したことメモ
ローカル実行: `if name == "main":`の部分があることで、ローカルでのテストが可能になります。調査したところ、この部分はローカルでPythonファイルを直接実行した場合のみ呼ばれ、AWS Lambdaでは自動的に`lambda_handler`関数が呼び出されるそうなので本番環境への影響はない想定です。
エラーハンドリング: `requests`ライブラリを使い、APIリクエスト時に発生する可能性のあるエラーをキャッチし、エラーメッセージを返すようにしています。
今後対応するところ
ローカルでの動作確認は問題なく完了しましたが、実際にAWS Lambda上で動作させる前に以下の対応を行なっていきます。
1. Dockerfileを使ったコンテナイメージの作成
AWS Lambdaでコンテナを使って関数を実行したいので、コンテナイメージをECRに置いておく必要があります。
そのため、Dockerfileを書いてDockerイメージを作成したいと思います。
2. APIキーの適切な保管と取り出しができるようにする
OpenWeatherMapのAPIキーをハードコーディングしないように、AWS Secrets ManagerやAWS Systems Manager Parameter StoreにAPIキーを保存するか、Terraformのtfvarsファイルから渡すかの2通りの方法で今のところ考えています。
メンテナンスしやすさとセキュリティ面の問題などないかを調べ直してから、どうAPIキーを扱うか決めたいと思います。
3. AWSリソースのTerraformでの定義とデプロイ
AWSのリソースを手動で構築するのではなく、Terraformを使ってコード化し、コマンドで管理できるようにしたいと思います。