外部サービス連携

AppFlowでSalesforceとS3をつなぐ設定手順

S3バケットを準備し、Amazon AppFlowでSalesforceを送信元、Amazon S3を送信先に設定する流れを説明します。Apexから直接S3を呼びたいときの注意点も併せて書きます。

2023.02.15

AppFlowを使う理由

SalesforceのデータをAmazon S3へ運ぶ方法は2つあります。1つはApexでS3のAPIを直接呼ぶ方法、もう1つはAmazon AppFlowでコードを書かずにつなぐ方法です。AppFlowは接続・認証・スケジュール実行を画面設定だけで済ませられるので、定期的なデータ連携ではまずこちらを検討します。Apexで直接呼ぶのは、AppFlowの対応範囲を超える細かい制御が要るときだけです。

S3バケットを準備する

  1. Amazon S3のコンソールでバケットを作成する

    バケット名は、ほかのAWSアカウントのバケットとも重複しない一意な名前を付けます。リージョンは「アジアパシフィック(東京)ap-northeast-1」のように、Salesforce組織や利用者に近いリージョンを選びます。

  2. オブジェクト所有者を確認する

    現在は新規バケットの既定が「ACL無効(バケット所有者の強制)」です。バケットの所有者がすべてのオブジェクトを所有する設定で、アクセス制御はバケットポリシーだけで行います。特別な事情がなければ既定のままにします。

  3. バケットのバージョニングを選ぶ

    既定は無効です。誤って上書き・削除したときに過去バージョンへ戻したいなら有効にします。

  4. 暗号化の設定を確認して作成する

    サーバー側の暗号化はSSE-S3が既定で選ばれています。そのまま「バケットを作成」を押します。

2023年1月5日以降、Amazon S3はすべての新規バケットでサーバー側の暗号化(SSE-S3)を既定で有効にします。この暗号化は無効にできません。選べるのは、既定のSSE-S3のままにするか、SSE-KMSやDSSE-KMSへ切り替えるかだけです。「サーバー側の暗号化を無効にする」という選択肢は、現在のコンソールにはありません。

Amazon AppFlowでフローを作成する

AppFlowの紹介画面と、フローを作成するボタンが置かれた起動パネル
AppFlowの入口です。右側の起動パネルにある作成ボタンから始めます。
AWSコンソールの検索結果に出たAmazon AppFlowのサービス項目
サービスの探し方です。コンソールの検索からこの項目を選んで開きます。
AppFlowの紹介ページ。右側に作成と表示の2つのボタンが並ぶ
紹介ページの右側です。新しく作るときは左のボタンを押します。
フローのセットアップの流れ図と、フロー名の入力欄
最初の画面です。上の流れ図で全4段階の作業を把握してから名前を入れます。
データ暗号化の設定とタグの欄。既定のキーで暗号化される旨の説明
同じ画面の下部です。暗号化は既定のままでよい点を確認して次へ進みます。
  1. Amazon AppFlowでフローを作成する

    「フローを作成」を押し、フロー名を入力します。

  2. 送信元にSalesforceを指定する

    「接続する」を押し、接続名を入力します。Salesforce環境は「Production」(本番組織)と「Sandbox」から、実際に接続する組織に合わせて選びます。認証はAppFlowが自動で用意する接続用アプリケーションによるOAuth認可で、Salesforce側で事前に接続アプリを作る必要はありません。認可画面で許可を押すと接続が完了します。

  3. 連携するSalesforceオブジェクトを選ぶ

    取引先など、転送したいオブジェクトを選びます。

  4. 送信先にAmazon S3を指定する

    準備したバケットを選びます。バケットが別リージョンにあると選択時にエラーになるので、S3バケットと同じリージョンでフローを作成します。

  5. フィールドのマッピングとトリガーを設定する

    「フィールドを直接マッピングする」を選び、フロートリガーは「オンデマンドで実行」を選びます。

  6. フローを作成して実行する

    設定内容を確認してフローを作成し、「フローを実行」を押します。実行履歴で成功・失敗を確認します。

フローを設定する画面。送信元と送信先の2つの選択欄が上下に並ぶ
送信元と送信先を決める画面です。上から順に選ぶと下の欄が使えるようになります。
Salesforceに接続するダイアログ。環境の選択と接続名の入力欄
接続の作成画面です。つなぐ組織の種類を選び、接続名を付けます。
Salesforceのアクセス許可画面。要求される権限が3つ箇条書きされている
許可の確認画面です。何が要求されているかを読んでから許可を押します。
転送するSalesforceオブジェクトの選択欄。取引先が選ばれている
運ぶ対象を選ぶ欄です。オブジェクトとイベントのどちらかを先に選びます。
送信先の詳細。データ送信先を選ぶ欄と次へ進むボタン
送信先を選ぶ欄です。ここでAmazon S3と、保存先のバケットを指定します。
バケットにアクセスできない旨の赤いエラー帯と、フロートリガーの選択欄
上の赤帯が、バケットと違うリージョンで作ったときのエラーです。下でトリガーを選びます。
項目の対応付け画面。送信元の項目一覧から選んだ項目が下に積み上がる
項目の対応付けです。左で選んだ項目が下に札として増えていくところを見てください。
対応付けが済んだ4項目の一覧。送信元と送信先の項目名が左右に並ぶ
対応付けの結果です。送信元と送信先が1対1で並んでいることを確かめます。
絞り込み条件を追加する画面。条件が未設定である旨の表示
絞り込みの画面です。全件送るときは何も追加せずに次へ進みます。
最終確認画面の絞り込み欄。条件0件の表示と作成ボタン
最後の確認画面です。右下のボタンでフローができあがります。
作成されたフローの詳細画面。送信元・送信先・状態と実行ボタン
作成後の画面です。右上の実行ボタンと、右側の状態表示を見てください。
フロー詳細のタブ。対応付け済みの4項目が一覧表示されている
作成後も対応付けは確認できます。上のタブで実行履歴にも切り替えられます。
フローを実行中であることを示す青い帯と開始時刻
実行直後の表示です。開始時刻が出て、完了までこの帯が残ります。
実行が正常に完了した旨の緑の帯。所要時間・転送サイズ・件数が並ぶ
完了時の表示です。所要時間と処理件数がここで分かります。
実行履歴の一覧。実行ID・日時・転送サイズ・件数・状態が1行に並ぶ
実行履歴です。成功か失敗かは、この一覧の状態の列で確かめます。
転送元となるSalesforceの取引先一覧。名前と都道府県・市区郡が並ぶ
転送元のデータです。この12件がそのまま送られる中身になります。
S3に書き出されたファイルの中身。1行1レコードで項目名と値が並ぶ
書き込まれたファイルです。1行に1件、対応付けた項目だけが入ります。

送信先バケットの書き込み権限

AppFlowコンソールでS3を送信先に選ぶと、必要なバケットポリシーはコンソールが自動で付与します。API・SDK経由でフローを作る場合は、次のポリシーを自分でバケットに設定する必要があります。

{
  "Statement": [
    {
      "Effect": "Allow",
      "Sid": "AllowAppFlowDestinationActions",
      "Principal": { "Service": "appflow.amazonaws.com" },
      "Action": [
        "s3:PutObject",
        "s3:AbortMultipartUpload",
        "s3:ListMultipartUploadParts",
        "s3:ListBucketMultipartUploads",
        "s3:GetBucketAcl",
        "s3:PutObjectAcl"
      ],
      "Resource": [
        "arn:aws:s3:::myBucketName",
        "arn:aws:s3:::myBucketName/*"
      ],
      "Condition": {
        "StringEquals": { "aws:SourceAccount": "myAccountId" },
        "ArnLike": { "aws:SourceArn": "arn:aws:appflow:*:myAccountId:flow/*" }
      }
    }
  ]
}

AppFlowサービスにs3:PutObjectなどを許可する例。myBucketNameとmyAccountIdは自分の値に置き換えます。

⚠️ Conditionのaws:SourceAccountとaws:SourceArnは、他のAWSアカウントのAppFlowから同じバケットを書き換えられてしまう「confused deputy」を防ぐための設定です。手動でポリシーを書くときは必ず入れます。

Apexから直接S3を呼びたいとき

AppFlowでは足りない細かい制御(1レコードずつの即時アップロードなど)をApexから行うときは、アクセスキー・シークレットキーをApexやRemote Site Settingsに直書きしません。代わりに名前付き認証情報(Named Credential)と外部認証情報(External Credential)を使います。

外部認証情報の認証プロトコルに「AWS Signature 4」を選ぶと、アクセスキー・シークレットキーの保管と、リクエストへのAWS署名の付与をSalesforceが代わりに行います。リモートサイト設定はドメインを許可リストに載せるだけで、署名やキーの保管はApex側で自分で実装する必要がありました。名前付き認証情報はここまで含めて設定画面だけで完結します。

HttpRequest req = new HttpRequest();
req.setEndpoint('callout:S3_Credential/example-bucket/upload.csv');
req.setMethod('PUT');
req.setHeader('Content-Type', 'text/csv');
req.setBody(csvBody);
Http http = new Http();
HttpResponse res = http.send(req);

Named Credential経由でS3へPUTする例。エンドポイントにキーを直接書きません。

⚠️ Apexのコールアウトには上限があります。1トランザクションで送れるコールアウトは合計100回まで、コールアウトの累計タイムアウトは120秒までです。ヒープサイズは同期処理で6MB、非同期処理で12MBまでなので、大きなファイルをループで送るとどちらかに先に当たります。件数が多いときはAppFlowかBatch Apexへ処理を分けます。

Salesforce側にアップロード済みのファイルをS3へ転送したいときは、AttachmentではなくContentVersionとContentDocumentLinkからファイル本体とレコードへの関連付けを取得します。Attachmentは新しいファイル管理の仕組みではないため、新規の実装では使いません。

ここで間違えやすい

間違い何が起きるか
バケット作成時に暗号化を無効にしようとする選択肢自体が無く、SSE-S3が既定で有効になります
S3バケットとは別リージョンでフローを作る送信先選択時にエラーになります
APIでフローを作ってバケットポリシーを設定し忘れるAppFlowがバケットへ書き込めず失敗します
AWSのアクセスキーをApexのコードに直書きする認証情報が変わるたびにコード修正とデプロイが要ります。名前付き認証情報を使います
ループで大量のファイルをコールアウトで送るコールアウト回数上限やヒープ上限に当たって途中で止まります

確認した環境

  • 2026年9月/Salesforce Summer '26(APIバージョン67.0)時点のdeveloper.salesforce.com・help.salesforce.comの公式ドキュメントで、名前付き認証情報とApexコールアウトの上限を確認しています
  • AWS側はdocs.aws.amazon.comのAmazon AppFlowユーザーガイドとAmazon S3ユーザーガイドで、バケット作成の既定値とバケットポリシーの要件を確認しています

まとめ

  • 定期的なデータ連携はAmazon AppFlowをまず検討します。Apexで直接呼ぶのは細かい制御が必要なときだけです
  • S3バケットの暗号化は2023年1月5日以降すべて既定で有効になり、無効にはできません
  • AppFlowコンソールでS3を送信先にすると、必要なバケットポリシーは自動で付きます。API経由で作るときは自分で設定します
  • Apexから直接S3を呼ぶときは、アクセスキーをコードに書かず名前付き認証情報とAWS Signature 4の外部認証情報を使います
  • Apexのコールアウトは1トランザクション100回・累計120秒・ヒープ6MB(非同期12MB)が上限です

Salesforceの導入・運用についてご相談ください

導入前の検討から、お使いの環境の改修・運用、AIとの連携まで承ります。状況を伺ったうえで、進め方をご提案します。