AWS
Azure
Storage

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


AWS S3とAzure Blob Storage間のファイル送受信


前提

AWS側はTransfer for SFTPを構築しておく。

SSH-Keygenで公開鍵と秘密鍵を作成しておく。


AWS側作業


IAM


  • ロールの作成

AmazonS3FullAccess権限を付与したロールに、「信頼関係」タブから信頼関係の編集を行う。

以下のポリシーを設定する。


 

{

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


  • ポリシーの作成

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


 

{

"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

SFTPユーザーの作成

Usernameに加えて、先ほど作成した

IAMロールをAccessに、ポリシーをPolicyに設定する。

S3バケット上のホームディレクトリと

事前に作成しておいた公開鍵のアップロードも行う。

awst02.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

続いて、SFTPコネクタでAWS Transfer for SFTPに接続する設定をする。

コネクタはSFTPの「Create File」を指定。

azure02.png

Folder Path に、AWS Transferで設定したユーザーのホームディレクトリ(/バケット名/ディレクトリ名)

File Name に、前ステップで取得したList of Files Name、

File Content に 前ステップで取得したFile Content

を、それぞれ指定する。

SFTPサーバーの指定は、左側のAPI Connections メニューからも行う事ができる。

azure03.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

しばらく経つと(1分以内)、Logic Appsが起動し

転送が正常終了したことがわかる。

azure06.png

AWS側のバケット内を確認すると、ちゃんとファイルが生成されている。

awst03.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

起動後、AWSバケット内のファイルが・・・

aws06.png

Azureのストレージ内にコピーされた事を確認。

azure08.png

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


問題点(解決済)

Logic Appsを経由すると送受信したテキストの日本語部分(マルチバイト文字)

が文字化けしている
事が判明。

azure099.png

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

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

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


追記

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

Logic Appsのアクションで

送信時の Get Blob Content using Path

auzre101.png

および、受信時の Get File Conttent using Path

azure102.png

それぞれ、

Infer Content Typeの値を「No」に設定する事で(デフォルトは「Yes」)

文字化けしなくなりました。

変更後の取得したファイル(先頭のみ)


 

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 対象