関連キーワード
お天気データサイエンスのリアルタイム配信(Push)で気象データを受信する際は、FTPサーバーかSFTPサーバーを用意する必要があります。また、容量が大きいデータを利用する場合は、保管のためのストレージも必要になります。
サーバーを自社で管理すると手間がかかるため、できるだけマネージドサービスを利用した方が便利かと思います。
そこで今回は、Amazon Web Service (AWS) のTransfer Familyで気象データを受信するSFTPサーバーを作成し、受信したデータをSimple Storage Service (S3)に保存する方法について紹介します。
※Amazon Web Services およびその他のAWS 商標は、米国およびその他の諸国におけるAmazon.com,Inc.またはその関連会社の商標です。
※ここで紹介する各サービスの利用方法、スクリーンショットは記事作成時のものであり、動作は保証できません。記事を参考に利用される場合は、自己の判断でお願いします。
※参考:AWS Transfer Familyのユーザーガイド
最終的に気象データを保管するバケットを作成しておきます。設定等はデフォルトで作成しました。必要に応じてライフサイクルルールを設定する等、ご検討ください。
バケットを作成したら、TransferFamilyで作成するユーザー名のフォルダ(/sftp_user)を作成しておきます。フォルダがないと「sftp directory change error」の配信エラーが発生します。
- IAMロール
transfer-s3-roleという名前で作成しました。簡単のために、
AmazonS3FullAccess
AWSTransferFullAccess
の許可ポリシーを設定します。必要に応じてアクセス許可範囲を設定してください。
- VPC、セキュリティグループ
適当なVPCでサブネットを作成し、ルートテーブルにはインターネットゲートウェイを設定しておきます。
セキュリティグループは、ヘルプページにある「受信に必要な設定」を参考に、該当IPアドレスからのインバウンドルールを設定します。ここでは簡単に22番ポートとします。セキュリティグループの名前はtransfer-sftpとしました。
- ElasticIP
1つ用意しておきます。
「サーバーを作成」をクリックして、まずプロトコルはSFTPを選択します。
IDプロバイダーは「サービスマネージド」を選択します。
エンドポイントのタイプは「VPCでホスト」を選択し、インターネット向けアクセスとします。
用意したVPCを選択し、サブネットを一つ選んで(アベイラビリティーゾーンはどこでもOK)、IPv4アドレスは用意したElastic IPを設定します。セキュリティグループも同様に用意したものを設定します。
ドメインはS3を選択します。
ロググループは「新しいロググループを作成」を選択しました。ここではワークフローは作成しないので、ログ記録ロールは不要です。
サーバーホストキーも空のまま進みます。
設定内容の確認画面に進むので、サーバーを作成します。作成には少し時間がかかります。
サーバーが作成されたら、状態がオンラインになり、以下の画面になります。
次に、ユーザーを追加します。
ここではユーザー名を「sftp_user」とします。
ロールは用意したIAMロールを選択します。
ホームディレクトリは、S3バケットを選択し、フォルダ名はユーザー名と同じにしています。「制限付き」のチェックは外しています。「制限付き」にチェックを入れると、配信システム側でホームディレクトリより上の階層は見えなくなり、S3バケットに自動的にフォルダが作成されます。
SSHパブリックキーには、ヘルプページに記載してある公開鍵を入力します。
ユーザーが作成できたら準備完了です。では、気象データを受信してみましょう。
リアルタイム配信(Push)を選択して配信設定画面を表示します。
SFTP(鍵認証)を選択し、必要な情報は以降のようにTransfer Familyのコンソールから確認して入力します。
「配信先ホスト」は、Transfer Familyのサーバー情報に表示されるエンドポイントかElastic IPを入力します。 「ユーザー名」には先ほど作成したユーザー「sftp_user」を入れます。
「配信先ディレクトリ」は、ユーザー「sftp_user」のホームディレクトリ「/(S3バケット名)/sftp_user」を入れます。(ホームディレクトリを「制限付き」にした場合は「/」(ルートディレクトリ)を入れてください。)
内容を確認して確定すると配信が開始されます。
配信設定した線状降水帯の雨域(シェープファイル形式)は10分毎に配信されるため、待っていれば受信状況を確認できますが、すぐに確認したい場合はPUSH配信設定画面で「操作・編集」にある「試験配信」をクリックすると、現在時刻が書かれたテキストファイル(test.txt)を配信することができます。
S3バケットにファイルが配置されていたら成功です。
PUSH配信履歴画面の「配信結果」に「リトライ」や「失敗」と表示されている場合はエラーが発生しています。「リトライ」や「失敗」をクリックするとエラー内容を確認することができるので、エラーメッセージに応じて設定を見直してください。エラーメッセージの説明はヘルプページの「トラブルシューティング」に記載しています。また、Transfer FamilyのログはCloudWatchログ(ロググループ:/aws/transfer/サーバーID)に出力されるので、そちらも参考になるかもしれません。
サーバーを運用管理する必要がなく、また、直感的な操作で簡単にS3に直接保存する仕組みが作れるのはとても便利に思いました。
Transfer Familyを使う際の注意点は、「同名ファイルの上書きに対応していないこと」です(Transfer Familyの「よくある質問」>プロトコル上でサポートされるファイル操作の表を参照)。配信システムは既にファイルがある場合はファイル削除を試みてから配信しますが、S3オブジェクトの削除権限がないと上書きできずにエラーが発生します。特に、同名ファイルが配信される可能性があるデータ(天気図画像ファイル等)では注意が必要です。
また、Transfer Familyは、現時点(2023年7月)では、SFTPが有効になっている時間に$0.3/時間、データ転送に$0.04/GBの料金がかかります。特にファイルサイズの大きな気象データを利用する場合はデータ転送料金に気をつけた方がよいでしょう。例えば、LFM-GPVをTransfer Family経由で受信した場合は、ファイルサイズは約25GB/日なので、データ転送料金は約$1/日かかることになりますね。
サーバーを自社で管理すると手間がかかるため、できるだけマネージドサービスを利用した方が便利かと思います。
そこで今回は、Amazon Web Service (AWS) のTransfer Familyで気象データを受信するSFTPサーバーを作成し、受信したデータをSimple Storage Service (S3)に保存する方法について紹介します。
※Amazon Web Services およびその他のAWS 商標は、米国およびその他の諸国におけるAmazon.com,Inc.またはその関連会社の商標です。
※ここで紹介する各サービスの利用方法、スクリーンショットは記事作成時のものであり、動作は保証できません。記事を参考に利用される場合は、自己の判断でお願いします。
※参考:AWS Transfer Familyのユーザーガイド
準備
- S3バケット最終的に気象データを保管するバケットを作成しておきます。設定等はデフォルトで作成しました。必要に応じてライフサイクルルールを設定する等、ご検討ください。
バケットを作成したら、TransferFamilyで作成するユーザー名のフォルダ(/sftp_user)を作成しておきます。フォルダがないと「sftp directory change error」の配信エラーが発生します。
- IAMロール
transfer-s3-roleという名前で作成しました。簡単のために、
AmazonS3FullAccess
AWSTransferFullAccess
の許可ポリシーを設定します。必要に応じてアクセス許可範囲を設定してください。
- VPC、セキュリティグループ
適当なVPCでサブネットを作成し、ルートテーブルにはインターネットゲートウェイを設定しておきます。
セキュリティグループは、ヘルプページにある「受信に必要な設定」を参考に、該当IPアドレスからのインバウンドルールを設定します。ここでは簡単に22番ポートとします。セキュリティグループの名前はtransfer-sftpとしました。
- ElasticIP
1つ用意しておきます。
Transfer Familyの設定
Transfer FamilyのコンソールからSFTPサーバーを設定していきます。「サーバーを作成」をクリックして、まずプロトコルはSFTPを選択します。
IDプロバイダーは「サービスマネージド」を選択します。
エンドポイントのタイプは「VPCでホスト」を選択し、インターネット向けアクセスとします。
用意したVPCを選択し、サブネットを一つ選んで(アベイラビリティーゾーンはどこでもOK)、IPv4アドレスは用意したElastic IPを設定します。セキュリティグループも同様に用意したものを設定します。
ドメインはS3を選択します。
ロググループは「新しいロググループを作成」を選択しました。ここではワークフローは作成しないので、ログ記録ロールは不要です。
サーバーホストキーも空のまま進みます。
設定内容の確認画面に進むので、サーバーを作成します。作成には少し時間がかかります。
サーバーが作成されたら、状態がオンラインになり、以下の画面になります。
次に、ユーザーを追加します。
ここではユーザー名を「sftp_user」とします。
ロールは用意したIAMロールを選択します。
ホームディレクトリは、S3バケットを選択し、フォルダ名はユーザー名と同じにしています。「制限付き」のチェックは外しています。「制限付き」にチェックを入れると、配信システム側でホームディレクトリより上の階層は見えなくなり、S3バケットに自動的にフォルダが作成されます。
SSHパブリックキーには、ヘルプページに記載してある公開鍵を入力します。
ユーザーが作成できたら準備完了です。では、気象データを受信してみましょう。
SFTP-PUSH配信設定
気象データはどれでもよいのですが、受信確認しやすいように高頻度に配信されるものを選びます。ここでは線状降水帯の雨域(シェープファイル形式)を配信設定してみます。リアルタイム配信(Push)を選択して配信設定画面を表示します。
SFTP(鍵認証)を選択し、必要な情報は以降のようにTransfer Familyのコンソールから確認して入力します。
「配信先ホスト」は、Transfer Familyのサーバー情報に表示されるエンドポイントかElastic IPを入力します。 「ユーザー名」には先ほど作成したユーザー「sftp_user」を入れます。
「配信先ディレクトリ」は、ユーザー「sftp_user」のホームディレクトリ「/(S3バケット名)/sftp_user」を入れます。(ホームディレクトリを「制限付き」にした場合は「/」(ルートディレクトリ)を入れてください。)
内容を確認して確定すると配信が開始されます。
配信設定した線状降水帯の雨域(シェープファイル形式)は10分毎に配信されるため、待っていれば受信状況を確認できますが、すぐに確認したい場合はPUSH配信設定画面で「操作・編集」にある「試験配信」をクリックすると、現在時刻が書かれたテキストファイル(test.txt)を配信することができます。
S3バケットにファイルが配置されていたら成功です。
PUSH配信履歴画面の「配信結果」に「リトライ」や「失敗」と表示されている場合はエラーが発生しています。「リトライ」や「失敗」をクリックするとエラー内容を確認することができるので、エラーメッセージに応じて設定を見直してください。エラーメッセージの説明はヘルプページの「トラブルシューティング」に記載しています。また、Transfer FamilyのログはCloudWatchログ(ロググループ:/aws/transfer/サーバーID)に出力されるので、そちらも参考になるかもしれません。
まとめと注意点
AWS Transfer FamilyでSFTPサーバーを作成し、受信した気象データをS3に転送してみました。サーバーを運用管理する必要がなく、また、直感的な操作で簡単にS3に直接保存する仕組みが作れるのはとても便利に思いました。
Transfer Familyを使う際の注意点は、「同名ファイルの上書きに対応していないこと」です(Transfer Familyの「よくある質問」>プロトコル上でサポートされるファイル操作の表を参照)。配信システムは既にファイルがある場合はファイル削除を試みてから配信しますが、S3オブジェクトの削除権限がないと上書きできずにエラーが発生します。特に、同名ファイルが配信される可能性があるデータ(天気図画像ファイル等)では注意が必要です。
また、Transfer Familyは、現時点(2023年7月)では、SFTPが有効になっている時間に$0.3/時間、データ転送に$0.04/GBの料金がかかります。特にファイルサイズの大きな気象データを利用する場合はデータ転送料金に気をつけた方がよいでしょう。例えば、LFM-GPVをTransfer Family経由で受信した場合は、ファイルサイズは約25GB/日なので、データ転送料金は約$1/日かかることになりますね。
この記事を書いた人
K.Sakurai
気象予報士/技術士(応用理学)/防災士
総合気象数値計算システムSACRA、データ提供システムCOSMOS及びお天気データサイエンスの開発に一から携わる。
WRF-5kmモデル、虹予報、虹ナウキャスト、1㎞メッシュ雨雪判別予測データ、2kmメッシュ推計日射量を開発。
趣味はバドミントンと登山。