AWS Lambda

AWS LambdaでISO-8601形式を変換してみる


概要

こんにちは、テクニカルサポートの牛山です。

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」形式のみサポートしているようでした。

※ date.fromisoformatリファレンス

dateutilパッケージ
拡張タイムゾーンと構文解析サポートのあるサードパーティーライブラリ

※ 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は普段触らない言語で、時間変換について理解が乏しかったため、数時間ムダにしてしまいました。

次回、同じ様なケースが出てきたら本ブログを頼りにします。

この記事が他の人のお役に立てれば幸いでございます。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA