Amazon AppFlowでSalesforceからRedshiftへの連携を試してみた

2020.05.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。

先日、連携サービスの「Amazon AppFlow」のS3からSnowflakeへの連携を触ってみましたが、今回はSalesforceからRedshiftへの連携を試してみました!

連携元:Salesforceのデータ確認

まずは、連携元としたいSalesforce側のデータです。今回は「取引先(Account)」を連携したいと思います。

このうちの、一部のデータを連携元データとして利用したいと思います。開発者コンソールで見ると以下のようなデータです。

SELECT  
    Id
  , Name
  , BillingState
  , Phone
FROM
  Account
ORDER BY
  Id

連携先:Redshiftの事前準備

Redshift側の下準備として、データを格納するテーブルを作成しておきます。

CREATE TABLE public.account(
    id VARCHAR,
	name VARCHAR,
	billing_state VARCHAR,
	phone VARCHAR
);

また下記ドキュメントにある通り、AppFlowが利用するS3バケットを準備し、バケットにアクセス可能なIAMロールを作成してRedshiftのクラスタへアタッチしておく必要があります。

今回S3側はfoobarというバケットを利用するものとして、以下のようなポリシーを持つIAMロールを作成し、Redshiftクラスタへアタッチしています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "kms:Decrypt",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::foobar/*",
                "arn:aws:s3:::foobar"
            ]
        }
    ]
}

その他、クラスタは「パブリックアクセス可能」として、セキュリティグループでAppFlowからアクセス可能とする必要があります。

今回は検証のために一時的にセキュリティグループでアクセス元IPの制限を全て解放して利用しましたが、ドキュメントを見る限り、現状では下記のドキュメントを参考にしてアクセスをし得るIPアドレスに限定して解放すると良さそうです。

AppFlowでフローを作成する

準備ができたら、早速フローを作成していきます。「フローを作成」ボタンをクリックして、開始します。

手順1:フローの詳細を指定

「フロー名」を指定し、今回は他はそのままにして次に進みます。

手順2:フローを設定

「送信元」と「送信先」の設定を行います。

まずは「送信元」の設定として「Salesforce」を選択し認証設定を行います。

連携データとしては「Salesforce オブジェクト」の「取引先」とします。

次に「送信先」の設定です。「Redshift」を選択し「新規接続を作成」を選びます。

「S3バケット」と「バケットプレフィックス」は、事前に準備したS3バケットとパスを指定します。「IAMロール」も同じく事前準備したものを指定しています。

なお、ロールのプルダウンリストですが、2020/05/11現在では表示できる数に上限があり、大量にロールがある場合には選択できないロールがありました。この場合、IAMロール名を工夫することで表示させることができます。今回はロール名の先頭に00_というプレフィックスを付けることで対応しました。

接続ができたら、送信先のスキーマとテーブルを指定して、他はデフォルトのままで次にすすみます。

手順3:データフィールドをマッピング

ここではSalesforceのオブジェクトのカラムを、Redshiftテーブルのカラムにどのようにマッピングするかを指定します。今回は手動マッピングを行いました。

「すべてのフィールドを直接マッピングする」を選択して、ダイアログ内でマッピングを指定します。

マッピングは準備したRedshift側のテーブルのカラムへそのままマッピングしています。

うまくマッピングが出来たら、他はそのままにして次にすすみます。

手順4:フィルターを追加

今回は設定しません。次にすすみましょう。

手順5:確認して作成

内容を確認して、問題なければ画面一番右下の「フローを作成」をクリックして完了です!

いざ、実行!

作成したフローを開いて「フローを実行」をクリックします。実行が開始され…

正常に終わりました!

Redshift側で確認します。

SELECT
    id
  , name
  , billing_state
  , phone
FROM
  public.account
ORDER BY
  id
;
id	name	billing_state	phone
0012v00002f3NRyAAM	Edge Communications	TX	(512) 757-6000
0012v00002f3NRzAAM	Burlington Textiles Corp of America	NC	(336) 222-7000
0012v00002f3NS0AAM	Pyramid Construction Inc.	NULL	(014) 427-4427
0012v00002f3NS1AAM	Dickenson plc	KS	(785) 241-6200
0012v00002f3NS2AAM	Grand Hotels & Resorts Ltd	IL	(312) 596-1000
0012v00002f3NS3AAM	United Oil & Gas Corp.	NY	(212) 842-5500
0012v00002f3NS4AAM	Express Logistics and Transport	OR	(503) 421-7800
0012v00002f3NS5AAM	University of Arizona	AZ	(520) 773-9050
0012v00002f3NS6AAM	United Oil & Gas, UK	UK	+44 191 4956203
0012v00002f3NS7AAM	United Oil & Gas, Singapore	Singapore	(650) 450-8810
0012v00002f3NS8AAM	GenePoint	CA	(650) 867-3450
0012v00002f3NS9AAM	sForce	CA	(415) 901-7000

無事に連携されてますね!

なお、S3バケットの中身も見てみましたが、こちらは空でした。

まとめ

以上、Amazon AppFlowのSalesforceからRedshiftへの連携のご紹介でした。

どなたかのお役に立てば幸いです。それでは!