Azure Logic AppsでAWS S3とファイル転送

#AWS S3とAzure Blob Storage間のファイル送受信
##前提
AWS側はTransfer for SFTPを構築しておく。
SSH-Keygenで公開鍵と秘密鍵を作成しておく。
##AWS側作業
###IAM
- ロールの作成

AmazonS3FullAccess権限を付与したロールに、「信頼関係」タブから信頼関係の編集を行う。
以下のポリシーを設定する。

```ruby:　
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "transfer.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

- ポリシーの作成

S3バケットに対するアクセス権をポリシーで設定する。

```ruby:　
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListHomeDir",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::${transfer:HomeBucket}"
        },
        {
            "Sid": "AWSTransferRequirements",
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },
        {
            "Sid": "HomeDirObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObjectVersion",
                "s3:DeleteObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::${transfer:HomeDirectory}*"
        }
    ]
}
```

上記のロールとポリシーは、SFTP Transfer作成後の「ユーザー」設定時に利用する。

### Transfer for SFTP

画面右上の「Create Server」から構築する。設定値は以下のとおり。

- DNS configuration　→　なし
- Identity provider　→　Server Managed
- Logging Role　→　なし
- Tags →　なし

数分でサーバーが「Online」状態になりエンドポイントが払い出される。
![awst01.png](https://qiita-image-store.s3.amazonaws.com/0/326784/78b05369-28fe-e4d1-3fad-2a5d163e3d50.png)

SFTPユーザーの作成

Usernameに加えて、先ほど作成した
IAMロールをAccessに、ポリシーをPolicyに設定する。
S3バケット上のホームディレクトリと
事前に作成しておいた公開鍵のアップロードも行う。
![awst02.png](https://qiita-image-store.s3.amazonaws.com/0/326784/e143bdf7-05b7-20ae-d226-0e8dd81ee877.png)

##Azure側作業
Logic AppsのSFTPコネクタを利用する。
SFTPコネクタには「SFTP」と「SFTP-SSH」の2種類あるが
今回は「SFTP」を利用する。
### Azureストレージ　→　S3への送信

送信元となるストレージアカウントとBlobコンテナを作成する。
Logic Appsの「When a blob is added or modified」トリガーを利用し、
定期的にコンテナ内をウォッチしてもらう。（ここでは1分毎）に設定

![azure01.png](https://qiita-image-store.s3.amazonaws.com/0/326784/b4b845c4-f1a7-171c-0736-26f7376421fd.png)

続いて、SFTPコネクタでAWS Transfer for SFTPに接続する設定をする。
コネクタはSFTPの「Create File」を指定。
![azure02.png](https://qiita-image-store.s3.amazonaws.com/0/326784/a4d14359-eb1f-6ec8-a7ba-2ce53cbb8748.png)

Folder Path に、AWS Transferで設定したユーザーのホームディレクトリ（/バケット名/ディレクトリ名)
File Name に、前ステップで取得したList of Files Name、
File Content に　前ステップで取得したFile Content
を、それぞれ指定する。

SFTPサーバーの指定は、左側のAPI Connections メニューからも行う事ができる。
![azure03.png](https://qiita-image-store.s3.amazonaws.com/0/326784/909bdab0-851a-bd4f-8251-09403ba48679.png)

- Host Server Addess　→　Transfer for SFTPのエンドポイント
- User Name →　Transfer for SFTPで作成したユーザー名
- Password →　秘密鍵を使うのでここは空欄
- SSH private key →　事前に作成していた秘密鍵をそのまま貼り付け
- SSH private key passphrase →　パスワード設定していなかったので空欄
- Port Number　→　22
- SSH Host Key Finger-print　→　Transfer for SFTPのユーザー管理画面で確認できるのでそのままコピペする。

以上、設定を保存して完了。

###送信できるかテスト

Logic AppsでBlobにファイルがアップされたらトリガ起動するようにしてるので
Blobをアップロードする。
![azure05.png](https://qiita-image-store.s3.amazonaws.com/0/326784/c88ce217-aa84-ed26-0861-f920053abdd3.png)

しばらく経つと（1分以内）、Logic Appsが起動し
転送が正常終了したことがわかる。
![azure06.png](https://qiita-image-store.s3.amazonaws.com/0/326784/9ced0a8b-6929-07c7-a614-5ddfddca8f55.png)

AWS側のバケット内を確認すると、ちゃんとファイルが生成されている。
![awst03.png](https://qiita-image-store.s3.amazonaws.com/0/326784/445f03f2-cbd1-c789-b58d-c29e96fb3d1d.png)

###受信できるかテスト
こんどはLogic Apps側からのgetをテストする。
トリガはタイマ起動の「Recurrence」
ファイル取得アクションは「Get file content using path」
- File Path　→　AWSバケット内のファイルパスを指定
- Infer Content Type　→ YES

Blobへのコピーは「Create Blob」
- Folder path　→　ファイルを配置するコンテナ名
- Blob Name →　配置するファイル名
- Blob Content →　前アクションで取得したFile Content
を、それぞれ指定する。以下が実際のフロー。

![azure07.png](https://qiita-image-store.s3.amazonaws.com/0/326784/44ee1097-b3e8-6ccf-6ee6-e01e0e1dd3db.png)

起動後、AWSバケット内のファイルが・・・
![aws06.png](https://qiita-image-store.s3.amazonaws.com/0/326784/f955d48c-2f47-0d99-8ecf-8578d39dc92d.png)

Azureのストレージ内にコピーされた事を確認。
![azure08.png](https://qiita-image-store.s3.amazonaws.com/0/326784/bcb8e776-ac4e-4626-2757-03b08f1bcd45.png)

以上、送受信が一応できる事まで確認できた。

###問題点（解決済）
Logic Appsを経由すると**送受信したテキストの日本語部分（マルチバイト文字）
が文字化けしている**事が判明。
![azure099.png](https://qiita-image-store.s3.amazonaws.com/0/326784/97fcb785-cdf3-75f8-2334-2a86871d1b4e.png)

以下などに参考になりそうな情報は載っているが詳細未確認

https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-content-type

解決方法が分かる方がいらっしゃいましたら教えていただけると助かります。

---
*追記*
文字化け防止方法がわかったので追記します。

Logic Appsのアクションで
送信時の *Get Blob Content using Path*
![auzre101.png](https://qiita-image-store.s3.amazonaws.com/0/326784/69120e9b-b1b7-ff16-1789-689e963f4de0.png)
および、受信時の *Get File Conttent using Path*
![azure102.png](https://qiita-image-store.s3.amazonaws.com/0/326784/a2060eb8-47fe-fd43-e16e-67c0061c539f.png)
それぞれ、
Infer Content Typeの値を「No」に設定する事で（デフォルトは「Yes」）
文字化けしなくなりました。

変更後の取得したファイル（先頭のみ）

```ruby:　
MASTERMASTERMASTERMASTERMASTERMASTERMASTERMASTERMASTERMASTERMASTERMASTERMASTERMASTERMASTERMASTERMASTERMASTERMASTERMASTER
1	0006	0001		アウトドア	sysdate	SEMNT	SEMNT	1	sysdate	SEMNT	SEMNT	INSERT INTO TBM_A2240 ( LSPDAIGENRECD, LSPCHUGENRECD, LSPCHUGENRENMKN, LSPCHUGENRENM, INSTIMESTAMP, INSLOGIN, INSPGID, REVISION, UPDTIMESTAMP, UPDLOGIN, UPDPGID ) VALUES ( '0006', '0001', '', 'アウトドア', sysdate, 'SEMNT', 'SEMNT', 1, sysdate, 'SEMNT', 'SEMNT' );	UPDATE TBM_A2240 SET LSPCHUGENRENMKN = '' , LSPCHUGENRENM = 'アウトドア' , , REVISION = REVISION + 1 , UPDTIMESTAMP = sysdate , UPDLOGIN = 'SEMNT' , UPDPGID = 'SEMNT' WHERE LSPDAIGENRECD = '0006' AND LSPCHUGENRECD = '0001';	SELECT '1=' || count(*) FROM TBM_A0080 WHERE LSPDAIGENRECD = '0006' AND LSPCHUGENRECD = '0001';	0	対象
2	0006	0005		釣り	sysdate	SEMNT	SEMNT	1	sysdate	SEMNT	SEMNT	INSERT INTO TBM_A2240 ( LSPDAIGENRECD, LSPCHUGENRECD, LSPCHUGENRENMKN, LSPCHUGENRENM, INSTIMESTAMP, INSLOGIN, INSPGID, REVISION, UPDTIMESTAMP, UPDLOGIN, UPDPGID ) VALUES ( '0006', '0005', '', '釣り', sysdate, 'SEMNT', 'SEMNT', 1, sysdate, 'SEMNT', 'SEMNT' );	UPDATE TBM_A2240 SET LSPCHUGENRENMKN = '' , LSPCHUGENRENM = '釣り' , , REVISION = REVISION + 1 , UPDTIMESTAMP = sysdate , UPDLOGIN = 'SEMNT' , UPDPGID = 'SEMNT' WHERE LSPDAIGENRECD = '0006' AND LSPCHUGENRECD = '0005';	SELECT '2=' || count(*) FROM TBM_A0080 WHERE LSPDAIGENRECD = '0006' AND LSPCHUGENRECD = '0005';	0	対象
```