[アップデート] AWS Transfer Family のログが JSON 形式で配信されるようになります

2023.06.23

いわさです。

AWS Transfer Family ではアクセスログがデフォルトでサポートされており、CloudWatch Logs へ出力されます。
従来のログ形式は次のようにフラットな形式のログが出力されていました。

本日のアップデートで JSON ログ形式がサポートされました。

サポートされたというより、デフォルトでこの形式になります。
ちなみに既存のサーバーは旧ログ形式のままです。新ログ形式を使う場合は明示的な切り替えが必要です。
ログをトリガーにしているような場合だと影響が出そうですが、既存サーバーが自動で切り替わるわけではないということでその点は安心しました。

後述しますがマネジメントコンソールから新規サーバーを作成した際には旧ログ形式は選択が出来ません。
旧ログ形式を前提にした仕組みを導入する場合は注意が必要です。(SDK などから旧ログの有効化は可能)

今回 JSON で出力出来るようになったので、他のサービスと同じ用に CloudWatch Logs Insights などでも取り扱いやすくなります。
また、ログ形式の変更にあわせて出力先ロググループを指定することも出来るようになりました。
これによって、例えば特定のロググループをインプットに集計処理などを行っている場合は、新規サーバー追加時のオンボーディング作業が簡略化されそうです。

この記事では新しい SFTP サーバーを作成し、新旧ログ形式を比較したり、旧ログ形式への設定変更方法などについても試してみましたので紹介します。

新しい設定とこれからのログ形式

まず、今回のアップデートでサーバー構築ステップのログ記録構成時に次のオプションエリアが追加されています。
従来はその下部のログ記録ロールを選択するだけだったのですが、マネジメントコンソールから新規サーバーを構築する際には新しいオプションである「構造化された JSON ログ記録」のみ選択が可能です。

ちなみに全てのプロトコルでサポートされています。

ログ記録設定を行って通常どおりクライアントからサーバーへアクセスすればログが出力されます。
デフォルトのロググループは次のようになっています。ここは旧設定の場合と同様ですね。

出力されたログは先程のようなフラットな形式ではなく、構造化された JSON 形式で次のように出力されます。

{
    "role": "arn:aws:iam::123456789012:role/IwasaHogeAllowSpecifyS3forTransfer",
    "activity-type": "CONNECTED",
    "ciphers": "chacha20-poly1305@openssh.com,chacha20-poly1305@openssh.com",
    "client": "SSH-2.0-OpenSSH_9.0",
    "source-ip": "203.0.113.1",
    "resource-arn": "arn:aws:transfer:ap-northeast-1:123456789012:server/s-3247578745c447688",
    "home-dir": "/",
    "user": "hoge",
    "kex": "ecdh-sha2-nistp256",
    "session-id": "382f5b209cb1ad29"
}

既存サーバーは明示的な切り替えを行うまで旧ログ形式のまま

まず、今回の新しいログ設定は既存のサーバーでは有効化されておらず、明示的に有効化する必要があります。
有効化する場合は次のように「Enable structured JSON logging」のチェックを ON にすることで有効化出来ます。
こちらから上記を有効化すると、既存のログ記録ロール設定は未設定となります。

ちなみにこちらの設定を有効化した後は、マネジメントコンソールから無効にすることは出来ません。
ロググループの宛先の変更はいつでも可能です。

基本的に新規の時でも変更の時でも、マネジメントコンソールから旧ログ設定を使うように設定をすることが出来ないようです。
次で解説しますが、AWS CLI などマネジメントコンソール以外からであれば無効化したり旧設定に変更することが可能です。

設定変更については一点注意事項があります。

上記公式ドキュメントに記述がありますが、切り替えのタイミングでまれに遅延が発生するそうです。
上記画面から変更を行うと、更新を行ったタイミングで旧ログ形式は出力されなくなるのですが、新しい JSON 形式でのログ記録が開始されるまで遅延が発生する場合があります。
サーバーへのアクセスが出来なくなるわけではないのですが、遅延の間のログが記録されない可能性がありますのでご注意ください。

旧ログ形式を使うには AWS CLI から設定可能

新規作成や、変更から新しいログ形式を有効化した場合はマネジメントコンソールから無効化が出来ません。
ただし AWS SDK や CLI 経由であれば旧ログ形式の設定が可能になっています。

方法としてはStructuredLogDestinationsパラメータに何も設定しなければ新ログ出力が無効化されます。
LoggingRoleを設定すると旧ログ出力が有効化されます。

ここでは新規作成したサーバーに対して、次のように新ログ出力を無効化し、旧ログ出力を有効化するように更新してみました。

% cat update-server.json
{
    "LoggingRole": "arn:aws:iam::123456789012:role/hoge-transfer-adminrole",
    "ServerId": "s-b50702da541e45838",
    "StructuredLogDestinations": []
}
% aws-v1 transfer update-server --cli-input-json file://update-server.json         
{
    "ServerId": "s-b50702da541e45838"
}

更新後、マネジメントコンソール上からも設定が変更されていることが確認出来ます。

SFTP クライアントからアクセスしてみると次のように同じロググループの別のログストリームに旧形式でログが出力されていることが確認できました。

新旧どちらのログも出力させることも出来る

マネジメントコンソールから新規作成あるいは更新を使って新ログ形式へ切り替えた場合は「ログ記録ロール」が設定されていないため旧ログ形式では出力がされません。

先程の手順では AWS CLI から新ログ出力を無効化して旧ログ出力を有効化しました。
こちらですが、実は新ログ出力を有効化しつつ旧ログ出力も有効化することが出来ます。

どちらも有効化されている場合はマネジメントコンソールから次のように「構造化された JSON ログ記録」と「ログ記録ロール」どちらも設定されていることが確認出来ます。

この場合は形式の違う重複した内容のログが別々のログストリームに出力されます。

CloudWatch Logs の取り込み料金に影響がありそうなので、注意しましょう。

さいごに

本日は AWS Transfer Family で新しいログ形式サポートされたので使ってみました。

サポートされたというか、マネジメントコンソールから新規サーバーを作成した際にはデフォルトで新しいログ形式が作成されるので今後はこちらがデファクトスタンダードみたいになっていきそうな気がします。 AWS CLI や CloudFormation で Transfer Family サーバーを構築しているような方はアップデートが必要になりそうですね。覚えておきましょう。

また、旧ログ形式のほうが都合が良いという方はマネジメントコンソール以外から設定することが可能なのでこの点も覚えておきましょう。
旧ログ形式が廃止される予定についてはドキュメント上言及されておらず、引き続きサポートされるとアップデートアナウンスでは触れられていました。