AWS Transfer for SFTPを使ってOpenSSHでS3へファイル転送してみる
おはようございます、もきゅりんです。
恥ずかしながら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