この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
おはようございます、もきゅりんです。
恥ずかしながらSFTP
という単語はよく聞くけど、どんなものなのかよく分からなかったこともあり、Transfer for SFTPを簡単に触ってみたのでまとめておきます。
手動で設定してみて、その内容をCFnで構築してみました。
下記、弊社ブログが参考になりました。
現在(2019/8/7)はこちらの記事よりロール設定が楽になっていました。
SFTPとは?から確認しておきます。
SFTP(SSH File Transfer Protocol)とは - IT用語辞典 e-Words
検索すればFTP,TFTP,FTPS,SFTP,SCPの違いなど出てきました。
メラ、メラミ、ギラ、ベギラマ、みたいだなとか思いました。
目次
- やること
- 1. S3バケットの作成
- 2. IAM ロールを作成
- 3. SFTPサーバの起動
- 4. SFTPユーザの作成
- 5. SFTPクライアントを使用してファイルを転送する
- 6. CFnでやってみる
- 参考
やること
基本的には、
に従って進めます。
- S3バケットの作成
- IAM ロールを作成
- SFTPサーバの起動
- SFTPユーザの作成
- SFTPクライアントを使用してファイルを転送する
- CFnでやってみる
1. S3バケットの作成
S3バケットの作成については、特に問題ないかと思います。
とりあえず適当な名前で作成してしまいましょう。
非公開で良いです。
2. IAM ロールを作成
IAMロールに進んでTransferサービスを選択します。
ここに記載されているようなポリシーを作成して進めます。
Amazon S3 バケットへの読み取りと書き込みアクセス権限の許可
に従って進めます。
Resource
のモザイクには作成したS3バケット名を入れて下さい。
ポリシーを作成したらロールにアタッチしてロールを作成します。
実際に利用するときは、ログを取得すると思うのでログのためのロールを作成しておきます。
こちらもここに記載されているようなポリシーを作成して進めます。
ロールの作成は、上記と同様にサービスはTransfer
を選択して作成したポリシーをアタッチします。
3. SFTPサーバの起動
に従って進めます。
今回は、以下の設定で作成します。
- Endpoint type: Public(インターネット経由でサーバーをアクセス可能)
- Custom hostname: なし (
serverId.server.transfer.regionId.amazonaws.com
) - Identity provider: Service managed
- Logging role: 先ほど作成したログのためのロール
- Tags: なし
4. SFTPユーザの作成
作成されたSFTPサーバを選択して、Add User
から設定します。
に従って進めます。
今回は、以下の設定で作成します。
- Username: moqrin
- Access: 作成したS3にアクセスするロールを選択
- Policy: なし
- Home directory: 作成したS3バケットを選択
- SSH public keys: 任意 (参考:キーペアのパブリックキーを取得する (Linux) | Amazon Elastic Compute Cloud Linux インスタンス用ユーザーガイド)
- Tags: なし
5. SFTPクライアントを使用してファイルを転送する
に従って進めます。
lls
コマンドとlcd
コマンドを利用することにより、ローカルホストのディレクトリ操作できます。
$ sftp -i transfer-key sftp_user@service_endpoint
Connected to sftp_user@service_endpoint
....
sftp> lls
Applications Movies Desktop
sftp> lcd Desktop
sftp> put moqrin.txt
Uploading moqrin.txt to /moqrin-sftp/moqrin.txt
moqrin.txt 100% 0 0.0KB/s 00:00
ログもちゃんと取得できていましたー。
なるほど。
便利かつ簡易ですねー。
6. CFnでやってみる
ついでなので、同様の設定をCFNで実行できるようにしておきます。
こちらは、下記弊社ブログが参考となりました。
$ aws cloudformation deploy --stack-name sftp-s3-stack \
--template -file sample.yml \
--capabilities CAPABILITY_NAMED_IAM
# sample.yml
AWSTemplateFormatVersion: 2010-09-09
Description: S3 and AWS Transfer for SFTP
# ------------------------------------------------------------#
# Resources
# ------------------------------------------------------------#
Resources:
#Home Directory用S3バケットの作成
HomeS3bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Join
- '-'
- - 'sftp'
- !Ref 'AWS::AccountId'
# SFTPサーバに適用するIAMRole
SFTPRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: transfer.amazonaws.com
Action: sts:AssumeRole
SFTPPolicy:
Type: 'AWS::IAM::Policy'
Properties:
PolicyName: SFTPPolicy
PolicyDocument:
Statement:
- Effect: Allow
Action:
- s3:ListBucket
- s3:GetBucketLocation
Resource: !GetAtt HomeS3bucket.Arn
- Effect: Allow
Action:
- s3:PutObject
- s3:GetObject
- s3:DeleteObjectVersion
- s3:DeleteObject
- s3:GetObjectVersion
Resource: !Join
- ''
- - 'arn:aws:s3:::'
- !Ref HomeS3bucket
- /*
Roles:
- !Ref SFTPRole
SFTPLogRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: transfer.amazonaws.com
Action: sts:AssumeRole
SFTPLogPolicy:
Type: 'AWS::IAM::Policy'
Properties:
PolicyName: CWLForSFTPPolicy
PolicyDocument:
Statement:
- Effect: Allow
Action:
- logs:CreateLogStream
- logs:DescribeLogStreams
- logs:CreateLogGroup
- logs:PutLogEvents
Resource: '*'
Roles:
- !Ref SFTPLogRole
#SFTP Serverの作成
SFTPServer:
Type: AWS::Transfer::Server
Properties:
EndpointType: PUBLIC
IdentityProviderType: SERVICE_MANAGED
LoggingRole: !GetAtt SFTPLogRole.Arn
#SFTP Userの作成
SftpUser:
Type: AWS::Transfer::User
Properties:
HomeDirectory: !Sub /${HomeS3bucket}/SFTPUSER
Role: !GetAtt SFTPRole.Arn
ServerId: !GetAtt SFTPServer.ServerId
SshPublicKeys:
- ssh-rsa xxxxxxxxxxxxxxxxxxxxxx
UserName: SFTPUSER
今回は以上です。
どなたかのお役に立てば幸いです。
参考
AWS Transfer for SFTP Documentation
新サービスAWS Transfer for SFTPを使って、WinSCPからS3へアクセスする #reinvent