
AWS Transfer for SFTPを使ってOpenSSHでS3へファイル転送してみる
この記事は公開されてから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












