AWS Transfer for SFTPを使ってOpenSSHでS3へファイル転送してみる

おはようございます、もきゅりんです。

恥ずかしながらSFTPという単語はよく聞くけど、どんなものなのかよく分からなかったこともあり、Transfer for SFTPを簡単に触ってみたのでまとめておきます。

手動で設定してみて、その内容をCFnで構築してみました。

下記、弊社ブログが参考になりました。

現在(2019/8/7)はこちらの記事よりロール設定が楽になっていました。

新サービスAWS Transfer for SFTPを使って、WinSCPからS3へアクセスする #reinvent

SFTPとは?から確認しておきます。

SFTP(SSH File Transfer Protocol)とは - IT用語辞典 e-Words

検索すればFTP,TFTP,FTPS,SFTP,SCPの違いなど出てきました。

メラ、メラミ、ギラ、ベギラマ、みたいだなとか思いました。

目次

やること

基本的には、

AWS Transfer for SFTP の詳細

に従って進めます。

  1. S3バケットの作成
  2. IAM ロールを作成
  3. SFTPサーバの起動
  4. SFTPユーザの作成
  5. SFTPクライアントを使用してファイルを転送する
  6. CFnでやってみる

1. S3バケットの作成

S3バケットの作成については、特に問題ないかと思います。

とりあえず適当な名前で作成してしまいましょう。

非公開で良いです。

2. IAM ロールを作成

IAMロールに進んでTransferサービスを選択します。

setup role1

ここに記載されているようなポリシーを作成して進めます。

Amazon S3 バケットへの読み取りと書き込みアクセス権限の許可

に従って進めます。

setup role2

Resourceのモザイクには作成したS3バケット名を入れて下さい。

setup policy

ポリシーを作成したらロールにアタッチしてロールを作成します。

setup role4

実際に利用するときは、ログを取得すると思うのでログのためのロールを作成しておきます。

こちらもここに記載されているようなポリシーを作成して進めます。

CloudWatch でのアクティビティのログ記録

setup logrole

ロールの作成は、上記と同様にサービスはTransferを選択して作成したポリシーをアタッチします。

3. SFTPサーバの起動

SFTP サーバーの作成

に従って進めます。

今回は、以下の設定で作成します。

  • Endpoint type: Public(インターネット経由でサーバーをアクセス可能)
  • Custom hostname: なし (serverId.server.transfer.regionId.amazonaws.com)
  • Identity provider: Service managed
  • Logging role: 先ほど作成したログのためのロール
  • Tags: なし

setup server

4. SFTPユーザの作成

作成されたSFTPサーバを選択して、Add Userから設定します。

ユーザーの追加

に従って進めます。

今回は、以下の設定で作成します。

add user

5. SFTPクライアントを使用してファイルを転送する

AWS 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

ログもちゃんと取得できていましたー。

log check1

log check2

なるほど。

便利かつ簡易ですねー。

6. CFnでやってみる

ついでなので、同様の設定をCFNで実行できるようにしておきます。

こちらは、下記弊社ブログが参考となりました。

[新機能] Transfer for SFTP が CloudFormation で作成可能になりました

$ 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

[新機能] Transfer for SFTP が CloudFormation で作成可能になりました

https://cns-guide.sfc.keio.ac.jp/2004/2/6/3.html