目次
概要
こんにちは、テクニカルサポートの牛山です。
AWS ConfigからEIPをチェックし、ルールに適合していなければ、Amazon EventBridgeを介して、AWS LambdaにEventを渡す機会がありました。
その際にEventから渡された、TimeStamp変換に苦戦したので備忘録として残しておきたいと思います。
AWS Lambdaで使用する言語は、Pythonとなります。
前提事項として、「python-lambda-local」を使用しローカル実行しております。
pytzがLambdaランタイムに含まれていないのでLambdaで直接実行する場合、pytzモジュールを含める必要があります。
AWS Lambdaに渡されるEvent内容
実際にAWS Configの監査でEIPチェックに問題があった場合、以下内容のEventが渡されます。
※長いため抜粋しております。
{
"detail": {
"newEvaluationResult": {
"resultRecordedTime": "2021-09-22T17:18:44.875Z"
},
},
}
AWS Configが評価結果を記録した時間で国際規格である「ISO-8601」を使用しています。
Pythonで「date.fromisoformat」関数を使用したら、無効な文字列として怒られてしまいました。
「YYYY-MM-DD」形式のみサポートしているようでした。
dateutilパッケージ
拡張タイムゾーンと構文解析サポートのあるサードパーティーライブラリ
こちらのサブモジュールにある「dateutil.parser.parse」関数は、幅広い時間形式に対応しており強力なので今回はこれを使用することにしました。
実際に変換してみる
import pprint
import boto3
import dateutil.parser
from pytz import timezone
def lambda_handler( event, context ):
debug = pprint.PrettyPrinter( indent = 4 )
#debug.pprint( type ( event[ 'detail' ][ 'newEvaluationResult' ] ) )
debug.pprint( event[ 'detail' ][ 'newEvaluationResult' ][ 'resultRecordedTime' ] )
# AWS Config が 評価結果を記録した時間(The time, in ISO-8601 format)
aws_config_record_time_str = event[ 'detail' ][ 'newEvaluationResult' ][ 'resultRecordedTime' ]
# datetime.datetime object へ変換
aws_config_record_time_dt = dateutil.parser.parse( aws_config_record_time_str )
utc_datetime_obj = aws_config_record_time_dt
# 日本時間へ変換
jst_timezone_datetime_obj = utc_datetime_obj.astimezone( timezone( 'Asia/Tokyo' ) )
# ISO フォーマットへ変換
convert_aws_config_record_time = jst_timezone_datetime_obj.isoformat( timespec = 'milliseconds' )
debug.pprint( convert_aws_config_record_time )
これを実行すると以下のようになり正常に変換されていることを確認できます。
'2021-09-22T17:18:44.875Z'
'2021-09-23T02:18:44.875+09:00'
まとめ
Pythonは普段触らない言語で、時間変換について理解が乏しかったため、数時間ムダにしてしまいました。
次回、同じ様なケースが出てきたら本ブログを頼りにします。
この記事が他の人のお役に立てれば幸いでございます。
プロフィール
AWSの設計・構築をメインにおこなっています。
運用・保守をおこなう部署におりましたが、最近、アーキテクト課に異動しました。
日々精進しております。
LINK
クラウドベリージャム:プロフィールページ