WinSCPでAmazon S3に接続

WinSCPでAWSに接続する方法
IAMのアクセスキーを使ってWinSCPからS3に接続できることを知らなかったので試してみます。また、S3サーバーアクセスログを有効にして、アクセスログを保管するように設定します。
参考記事: Amazon S3プロトコルに対応したWinSCP 5.13を使ってみた
設定の流れ
設定としては大きく2つに分けていまして、接続先となるAWS側の設定と、接続元となるクライアント側の設定があります。
- AWS側の設定
1-1. S3バケット作成
1-2. S3サーバーアクセスログ設定
1-3. IAMユーザ作成とアクセスキー発行 - クライアント側の設定
2-1. WinSCPインストール
2-2. 接続確認
1.AWS側の設定
1-1.S3バケット作成
WinSCPの接続先となるS3バケットを作成します。AWSマネジメントコンソールからS3のサービスを選び、S3のバケット作成画面に移動します。

S3バケット名やAWSリージョンは任意のものを設定します。その下のACL有効/無効は、推奨の無効を選択します。ACLはS3の古いアクセス管理の方法のため非推奨となっています。
パブリックブロックアクセス設定ですが、パブリックアクセスの設定は不要のため「パブリックアクセスをすべてブロック」にします。設定済みの場合はそのまま次に進みます。

以降の設定は要件に応じて設定していきます。デフォルトの暗号化はSSE-S3キーを選びました。
SSE-S3とSSE-KMSの違いは以下のページをご確認ください。
下までスクロールして、バケット作成を選択します。

同様の手順で、サーバーアクセスログ保管用のS3バケットも作成します。サーバーアクセスログを設定しない場合はスキップして下さい。アクセスログ保管用のS3バケットを作成する際は設定内容に以下の注意点があります。
注意点
- サーバーアクセスログ保管用のS3バケットではオブジェクトロックは無効にする
- サーバーアクセスログ保管用のS3バケットではデフォルト暗号化は無効もしくはSSE-S3を選択する
Amazon S3 サーバーアクセスログが配信されないのはなぜですか?
1-2.S3サーバーアクセスログの設定
S3サーバーアクセスログを設定をする場合のこの手順を実施します。S3サービスの画面から「バケット」→接続先のS3バケットを選択→「プロパティ」→「サーバーアクセスのログ記録」の「編集」を選択します。

ログの記録を「有効にする」を選び、ターゲットバケットとしてログ保管先のS3バケットを選びます。自分自身のバケットにログを保管することも可能ですが別バケットへの保管が推奨されます。

別バケットへの保管が推奨される理由
ログを管理しやすくするため、アクセスログは別のバケットに保存することをお勧めします。ソースバケットとターゲットバケットが同じである場合、バケットに書き込まれるログに関する追加のログが作成されます。これは、ストレージの請求額がいくらか増える可能性があるため、望ましくない場合があります。また、ログに関する追加のログのために、必要なログを見つけにくくなります。
アクセスログの設定は以上で完了です。
1-3.IAMユーザ作成とアクセスキー発行
続いてはIAMユーザの作成とアクセスキーの発行を行います。IAMサービス画面の「ユーザー」から「ユーザー追加」を選択します。

任意の名前を付けて、認証情報タイプとして「アクセスキー – プログラムによるアクセス」を選びます。コンソールへのログインを行わないユーザーのため、マネジメントコンソールへのアクセスにはチェックを付けません。

権限を後で付与するため、何も設定せずに次へと進みます。

タグを設定しないため次へと進みます。

内容を確認して「ユーザーの作成」ボタンを押します。

ユーザーの作成が完了するとアクセスキーとシークレットアクセスキーが発行されますのでメモするかCSVをダウンロードします。ここでシークレットキーを控え忘れるとアクセスキーを再発行することになるため注意が必要です。この情報を第三者が知ってしまうと設定した権限でアクセス可能となるため、控えたメモやCSVファイルの扱いは要注意です。

作成後にIAMの「ユーザー」から作成したユーザーを選び、「アクセス権限」タブから「インラインポリシーの追加」を選択します。

権限付与の方法としてはポリシーを個別に作って割り当てる方法もありますが、今回はインラインポリシーを選びました。インラインポリシーと管理ポリシーの違いについては以下の情報が参考になります。
インラインポリシーの設定画面から、ポリシーの内容としてjsonで記述した以下のポリシーを貼り付けます。「bucket-name」は接続先のS3バケット名に置き換えてください。また、必要に応じてPutObjectやDeleteObjectなどの権限を追加下さい。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListObjectsInBucket",
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::bucket-name"]
},
{
"Sid": "GetObjectAction",
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": ["arn:aws:s3:::bucket-name/*"]
}
]
}
設定可能な権限の参考情報
ポリシーに任意の名前をつけて作成します。

以上でAWS側の作業は完了です。
2.クライアント側の設定
接続元となるクライアントでWinSCPのインストールとS3への接続を行います。設定のために以下の情報が必要です。
- アクセスキー(手順1-3で発行したもの)
- シークレットキー(手順1-3で発行したもの)
- 接続先のS3バケット名
2-1.WinSCPインストール
WinSCPをインストールします。


インターフェイススタイルは好みですが、今回はコマンダーを選びます。


スタートページはWebサイトが開くのでチェックを外してもいいでしょう。

インストールが完了しました。
2-2.接続確認
WinSCPを起動したら新規接続の設定画面が表示されますので設定していきます。 まずは転送プロトコルに「Amazon S3」を選びます。

アクセスキーIDとシークレットキーに手順1-3で発行したキーを入力します。そのあとすぐ下の「設定」を選びます。

環境のディレクトリから、「リモートディレクトリ」として接続先のバケット名を入力します。下記画像の例では「/target-backet-name」と入力しています。

そのあと「OK」を押して元の画面に戻り「ログイン」ボタンを押すと接続できます。

接続できましたああああ!!
補足情報
設定としては以上ですが補足情報を紹介します。
アクセス権限
リモートディレクトリを指定しないと以下のように接続に失敗します。

IAMユーザーの権限にS3FullAccessなど強い権限をつけるとリモートディレクトリの指定無しでも以下のようにアクセスできますが、S3バケット一覧が表示されて接続不要なバケットにもアクセスできてしまいます。今回のように対象バケットに絞ったアクセスが望ましいでしょう。

アクセスログ
アクセスログ保管先のバケットを見ると以下のようにログファイルが保管されます。

ログのフォーマットについては以下のユーザーガイドに情報が記載されています。
参考: Athena を使用して Amazon S3 サーバーアクセスログを分析する方法を教えてください。
参考: S3のサーバーアクセスログから、接続失敗ログを洗い出す
それでも失敗する場合は、以下の記事を読んでみてください:
WinSCPに接続できない時の対処法10選!サーバー接続・ログインできない原因を解決!
参考情報
- WinSCP Official Site
- https://github.com/winscp/winscp
- Amazon S3 サーバーアクセスログが配信されないのはなぜですか?
- サーバーアクセスログを使用したリクエストのログ記録
- 管理ポリシーとインラインポリシーの比較
- Amazon S3 サーバーアクセスログの形式
- Athena を使用して Amazon S3 サーバーのアクセスログを分析するにはどうすればよいですか?
- S3のサーバーアクセスログから、接続失敗ログを洗い出す
- วิธีอัปโหลดไฟล์ด้วย WinSCP ไปยัง Server Website ที่ตั้งค่าใน EC2
- 新サービスAWS Transfer for SFTPを使って、WinSCPからS3へアクセスする #reinvent
- WinSCPでAmazon LinuxにSFTP接続してみた
DevelopersIOのAWS関連記事のご紹介
DevelopersIOは、運営企業であるクラスメソッドのエンジニアが執筆した記事が9割を占めます。AWS総合支援サービス「クラスメソッドメンバーズ」を提供する中で得た実践的なTIPSから最新のAWSサービスの応用まで、幅広い技術情報をお届けしています。