AWS Transfer for SFTP – Amazon S3と連携したマネージドなSFTPサービス

2019-03-09Amazon

SFTPへのPOST機能しか持ち合わせていないようなサービスをどうしても使いたい場合に利用できそうなので、調べてみました。

概要

AWSのブログサイトより引用

  • 新発表 – AWS Transfer for SFTP – Amazon S3と連携したマネージドなSFTPサービス | Amazon Web Services ブログ

    SFTP(Secure File Transfer Protocol) は、長年に渡って使用されてきたデータ処理やパートナー連携の一部として、現在でも多くの組織で利用されています。
    このようなシステムを「レガシー」という言葉で片付けてしまうのは簡単ですが、現実には、今後も長期間に渡ってSFTPは利用され続けるでしょう。
    そこで私達は、このようなワークフローを持つお客様が、スムーズかつ、大きな変更を伴わずにクラウド環境に移行できるようなお手伝いをしたいと思います。

SFTP 経由で Amazon S3 と直接ファイル転送できます。

( SFTP = Secure Shell File Transfer Protocol の略称で、インターネット経由の安全なデータ転送に使用されるネットワークプロトコル。 )

こちらのサービスを利用しない場合、既存サービスとS3の間にSFTPサーバを立てて、転送する仕組みを構築しないといけない。

[既存サービス(SFTP POSTのみ可能)] ===> 【AWS Transfer for SFTP】 ===> [AWS S3]

利用するための大まかな手順

  1. サーバーを作成
  2. SFTP接続用のユーザアカウントをセットアップ
    • ひとつまたは複数のAmazon Simple Storage Service(S3)バケットと関連付ける
    • ssh接続用の公開鍵を作成し、アップロードする

作業開始

サービスページを開く

マネージメントコンソールの「サービスを検索する」の欄に transfer と入力すれば見つかる。

早速開いてみます。

IAMユーザで "AWS Transfer" コンソールページが開けない。

パーミッションの設定がまずいのか、新規に作成した IAMユーザ では "AWS Transfer" コンソールページが開けない。

以下の権限を設定をしてみたがページが閲覧できなかった。

  • AWSMarketplaceFullAccess
  • AWSStorageGatewayFullAccess
  • AWSTransferLoggingAccess
  • AmazonAPIGatewayAdministrator
  • AmazonAPIGatewayInvokeFullAccess
  • AmazonDMSRedshiftS3Role
  • AmazonDynamoDBFullAccess
  • AmazonElastiCacheFullAccess
  • AmazonS3FullAccess
  • IAMUserChangePassword
  • QuickSightAccessForS3StorageManagementAnalyticsReadOnly

ひとまず AWSのルートアカウント でログインし、 "AWS Transfer" のページを開く。

無事閲覧できた。

サーバーを作成

Create Server をクリックします。

  • 認証設定 として以下のようなものを選択可能
    • Transfer for SFTPで管理されるユーザー・パスワードを利用する
    • 既存のLDAPやActive DirectoryによるIDプロバイダをAPI Gateway経由で利用する
  • DNS設定 として以下のようなもの選択可能
    • Amazon Route 53のDNS alias
    • 既存のDNSサーバ
項目備考
DNS configurationSFTPサーバの名前解決
* None
* Amazon Route53 DNS alias
* Other DNS
——————-————————————-
Identity provider認証を行う場所
* Service Managed
* Custom
——————-————————————-
Logging roleCloudWatch logsに転送する際のロール
——————-————————————-
Tagsタグ

今回は検証のために
すべてデフォルト設定のまま、Create Serverをクリックし、実際に自分のSFTPサーバーを立ち上げてみます。
( DNS configurationNoneIdentity providerService Managed で設定されているはず。 )

サーバの一覧が表示され、 Starting 状態となっていることがわかります。

Online になったら利用可能。
意外と時間がかかる。
( 常時ブラウザをリフレッシュしていたわけではないが、2〜3分では反映されず、5分後にページ再表示してようやく Online になった。 )

SFTP接続用のユーザアカウントをセットアップ

(既存のS3バケットを指定する場合は不要)S3バケットの作成

ユーザ追加のタイミングで、どのS3バケットにアクセスできるか?という設定が必要になるため、事前に検証用のS3バケットを作成しておく。

S3の管理コンソールページへ。

「バケットを作成する」 ボタンを押下。

あとはデフォルトのまま、次へ次へと進んでいけばOK。

SFTP接続用のユーザアカウントの作成

Online 状態となったサーバのIDをクリック。

以下のようなページが表示されます。

Identity providerService Managed を選択した場合は、管理画面上からSFTPユーザを追加、削除、変更などができるようになります。
はじめてなのでこれが使いやすいとおもいます。

  • Username
  • Access
  • Policy
  • SSH public keys

などが指定できます。

Username : 適当に入力します。sshでログインする際に使用するため忘れないようにしましょう。

Access : Allow 設定情報と読み替えてもいい。 S3バケットの可能な操作(追加、更新、削除、参照)

Policy : Deny 設定情報と読み替えてもいい。バケットのユーザーを一部に割り当てる場合、たとえばホームディレクトリのみアクセスさせるなど今回はアクセスの制限を行わずに進めます。

Home directory という設定には AWSの S3バケットを指定します。
今回は事前に作成したS3バケットを指定します。

SSH public keys では、sshの公開鍵を設定します。
どうやらこちらも事前に作成しておく必要があったようなので、今このタイミングで作成します。

# ssh鍵を作成(パスフレーズは空でも何でもいい)
$ ssh-keygen -t rsa -f $HOME/.ssh/s3-transfer-for-sftp.rsa

# 公開鍵、秘密鍵の権限を変更
$ chmod 600 $HOME/.ssh/s3-transfer-for-sftp.rsa*

# 公開鍵を表示(こちらはクリップボードにこぴーしておく)
$ cat $HOME/.ssh/s3-transfer-for-sftp.rsa.pub

先のページの SSH public keyInfo の欄に貼り付ける。

実行結果

# アップロード検証用のファイルを作成
$ echo hello > /tmp/test

# ssh秘密鍵とログインユーザのIDを指定
$ sftp \
  -i ~/.ssh/s3-transfer-for-sftp.rsa \
  testuser@s-c60374016cad42b99.server.transfer.ap-northeast-1.amazonaws.com\n

# sshでログインはできた!
Warning: Permanently added the RSA host key for IP address '52.68.14.12' to the list of known hosts.

Connected to testuser@s-c60374016cad42b99.server.transfer.ap-northeast-1.amazonaws.com.

sftp> put /tmp/test
Uploading /tmp/test to /s3-transfer-for-sftp/test
remote open("/s3-transfer-for-sftp/test"): Failure

最後の最後で、ファイル書き込みができずにエラー発生。

IAMロールの設定変更が必要

(2019-02-19 追記)

今回SFTPユーザに割り当てた IAMロール設定 に不備がありました。
以下の記事が大変参考になりました。

同じように IAMロール設定で若干引っかかった という内容が書かれていました。


設定を修正するために、IAMロール設定を開く。
「信頼関係の編集」というボタンをクリック。

許可対象のサービスを書き換える。(以下を参照)


これでSFTP接続後にread / writeできるようになりました。

2019-03-09Amazon