Amazon AppFlow 入門として Slack から S3 へデータをロードするフローを作ってみた

Amazon AppFlow を完全に理解しました。

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

とりあえず AppFlow を触ってみたい

コンバンハ、千葉(幸)です。

Amazon AppFlow はコーディング不要で SaaS アプリケーションや AWS サービス間のデータ転送を実現するマネージドなインテグレーションサービスです。

今まで触ったことがなかったので、いっちょ入門してみるかということで一番とっつきやすそうな Slack → S3 のフローを作ってみることにしました。

以下に載っている内容をベースに、個人的につまずきが多かった Slack 周りの設定を厚めに取り上げていきます。

今回作成する AppFlow の構成

イメージ図はこちらです。

最終的には AppFlow でフローというリソースを作成し、フローの実行を行うことでデータの転送が行われます。

フローでは送信元送信先を指定することになり、今回で言えばそれぞれ Slack と S3 が該当します。Slack をフローに設定するためには接続情報などを定義したコネクタプロパティ(コンソールでは「接続」と表される)の作成も必要になります。

Slack のコネクタプロパティを作成するためには Slack 側でいくつか準備が必要なため、それを先に行う手順で進めていきます。

  1. Slack アプリの設定
  2. S3 バケットの設定
  3. AppFlow フローの作成
  4. AppFlow フローの実行

1. Slack アプリの設定

今回は個人の検証用の Slack のワークスペースchibayukiを作成し、そこでアプリの設定を行なっていきます。

アプリの作成

Slack ワークスペースから「設定と管理」→「アプリを管理する」で管理画面に遷移します。

わたしの環境ではまだアプリがインストールされていない状態です。右上の「ビルド」から`https://api.slack.com/apps/`に遷移します。

appflow_slack_build

「Create an App」を押下します。

appflow_Slack_API__Applications___Slack

「From scratch」を押下します。

appflow_Slack_API__Applications___Slack-7816928

アプリ名、ワークスペースを指定し、「Create App」を押下します。

appflow_test_Slack_API__Applications___Slack

アプリが作成されたら、「Basic Information」からアプリのクレデンシャルが確認できます。以下の情報を AppFlow のコネクタプロパティ作成時に使用するため、控えておきましょう。

  • Client ID
  • Client Secret

appflow_app_Slack_API__Applications___chibayuki_Slack

OAuth & Permissions の設定

アプリの OAuth & Permissionsセクションから以下の設定を行なっていきます。

  • リダイレクト URL
  • ユーザートークンスコープ

appflow_oauth_permissions

リダイレクト URL

リダイレクト URL に設定する URL は以下です。

  • us-east-1リージョンの場合
    • `https://console.aws.amazon.com/appflow/oauth`
  • それ以外のリージョンの場合
    • `https://{region}.console.aws.amazon.com/appflow/oauth`

今回は AppFlow を東京リージョンで作成予定のため、`https://ap-northeast-1.console.aws.amazon.com/appflow/oauth`を設定しました。

ユーザートークンスコープ

以下ページに記載のあるスコープを設定していきます。ここで許可した内容が AppFlow で許可されることになります。

2022年11月現在では以下が該当します。

  • channels:history
  • channels:read
  • groups:history
  • groups:read
  • im:history
  • im:read
  • mpim:history
  • mpim:read

アプリのインストール

作成したアプリをワークスペースにインストールします。

appflow_Slack_API__Applications___chibayuki_Slack

確認画面で許可すればインストールの完了です。

appfloe_slack_app_install

2. S3 バケットの設定

フローで送信先として設定する S3 バケットを準備します。

とは言え特に特別な設定は必要ありません。マネジメントコンソールからフローの設定をする際には S3 バケットポリシーを自動で修正してくれるので、あらかじめ設定しておく必要もありません。

今回はChikayuki-hoge-hogeという名称のバケットを以下設定で準備しました。

  • オブジェクト所有者:ACL 無効
  • ブロックパブリックアクセス:すべてブロック
  • デフォルト暗号化:SSE-S3
  • バージョンニング:有効
  • バケットポリシー:なし(現時点では。)

詳細な要件などはこちらをご確認ください。(送信に設定する場合の固有の事項などもありますのでご注意ください。)

3. Appflow フローの作成

いよいよ AppFlow フローを作成していきます。後から考えると、先にコネクタプロパティを作成しておいた方が仮にエラーになった時の手戻りが少なくて済むのでおすすめです。

今回はフローの作成の中でコネクタプロパティの作成も行います。

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

AppFlow コンソールから「フローを作成」を押下します。

appflow_Amazon_AppFlow

フロー名を指定し次に進みます。

appflow_step1

↑デフォルトでは AWS 管理の KMS キーで暗号化されますが、カスタマー管理のキーを指定することもできます。

手順2. フローを設定【送信元】

送信元の設定に合わせてコネクタプロパティ(接続)を作成します。「送信元名」で Slack を選択し、「接続する」を押下します。

app_flow_slack_Amazon_AppFlow

以下を入力し、「続行」を押下します。

  • クライアント ID
  • クライアントシークレット
  • ワークスペース名
  • 接続名

appflow_slack_Amazon_AppFlow

OAuth 認証画面に遷移するため、「許可する」を押下します。

appflow_oauth_slack

正常に接続が作成されたら、以下を選択します。

  • Slack オブジェクト(現時点ではConversationsのみ)
  • Slack チャンネル(ワークスペース内のチャンネル)

Appflow_source_Amazon_AppFlow

これで接続が作成されます。


ちなみに

接続の作成時に以下のエラーが発生した時があったのですが、これは単に入力する値を間違えていたためでした。(クライアントシークレットでなく Signing Secret を入力していた。)

Error authenticating to connector: Authentication exception from connector: Error while deserializing auth response

他にも Slack 側の設定不備でエラーが発生することがあるかと思います。上記のエラーが発生した際には改めて見直してみてください。

ちなみに 2

接続の作成時に入力した内容は AWS Secrets Manager シークレットに保存されています。

名称は以下の規則で作成されるようです。

appflow!{アカウント番号}-{接続名}-{作成時刻(UNIX時間)}

appflow_Secrets_Manager-7819588

説明書きはこのような感じ。

appflow owned service linked secret created for connector profile [TestConnect] and account [012345678910]. Deleting the secret will fail execution for associated active flows.

値は以下の種類が含まれていました。

  • clientId:入力したもの
  • clientSecret:入力したもの
  • accessToken:OAuth 認証で取得したもの

appflow_Secrets_Manager-7819677


手順2. フローを設定【送信先・フロートリガー】

続きを進めていきます。送信先として、準備した S3 バケットを選択します。細かい設定を行うこともできますが、今回はすべてデフォルトのままにします。

appflow_s3_Amazon_AppFlow

最後にフロートリガーを選択し次へ進むことで手順2 は終了です。

appflow_triger_Amazon_AppFlow

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

データに含まれるフィールドについて、送信元と送信先でマッピングを行います。

細かく指定もできますが、「送信先フィールド名」で「すべてのフィールドを直接マッピングする」を選択しおまかせします。マッピングされたフィールドが自動的に設定されました。

appflow_mapping

↑「妥当性確認」でフィールドごとにバリデーションができますが、今回は特に指定せず次に進みます。

手順4. フィルターを追加する~手順5. 確認して作成

手順4 でフィルターを追加できます。今回のケースでは選択できるフィールドはTimestampのみでした。せっかくなので適当な値を追加してみました。(UNIX 時間で1111111111はおおよそ 2005/3/18 なので、「それより大きい」はほぼ意味をなさない。)

appflow_filter_Amazon_AppFlow

最後のステップとして手順 5 でこれまでの設定値を確認し、「フローを作成」を押下すればフローの作成は完了です。(後から撮り直したので細部のパラメータが異なっていますが気にしないでください。)

appflow_create_flow


ちなみに 3

フローの作成完了後、送信先として指定した S3 バケットのバケットポリシーを確認すると以下の値が設定されていました。

送信先バケットに自動生成されたバケットポリシー

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AllowAppFlowDestinationActions",
            "Effect": "Allow",
            "Principal": {
                "Service": "appflow.amazonaws.com"
            },
            "Action": [
                "s3:PutObject",
                "s3:AbortMultipartUpload",
                "s3:ListMultipartUploadParts",
                "s3:ListBucketMultipartUploads",
                "s3:GetBucketAcl",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::chibayuki-hoge-hoge",
                "arn:aws:s3:::chibayuki-hoge-hoge/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "012345678910"
                }
            }
        }
    ]
}

appflow.amazonaws.comからのアクションを許可しつつ、Condition 句で AWS アカウントを限定することで権限を絞っていますね。

4. AppFlow フローの実行

準備が整ったので、いよいよ AppFlow フローを実行していきます。

コネクタプロファイルで設定した Slack チャンネルでは以下のように 3 つだけ書き込みがある状態です。

appflow_slack_connector

フローの画面から「フローを実行」を押下します。

app_flow_run_Amazon_AppFlow

画面の上部に実行結果が表示されます。今回はレコード数も少ないのであっという間に完了しました。

appflow_run__Amazon_AppFlow

出力先のバケットを確認すると、以下のようなパスでオブジェクトが格納されていました。

s3://chibayuki-hoge-hoge/test-flow/ec11eeca-fdfc-48b2-80c8-231ddf6643a9/-1258851841-2022-11-07T11:25:39

appflow_s3_output

オブジェクトの中身を確認するとこのような感じ。

{"blocks":[{"type":"rich_text","block_id":"IMzDL","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"テスト書き込みです"}]}]}],"client_msg_id":"9f75e39d-3c7a-4c63-9206-0fa9ad39ec58","text":"テスト書き込みです","team":"T04AFLPMR16","ts":"1667820261.475789","type":"message","user":"U04A4K1NRT3"}
{"blocks":[{"type":"rich_text","block_id":"IY=R","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"テスト書き込み"}]}]}],"client_msg_id":"4def0244-af04-4e95-8dc9-e5c0a98d23ac","text":"テスト書き込み","team":"T04AFLPMR16","ts":"1667820254.200019","type":"message","user":"U04A4K1NRT3"}
{"subtype":"channel_join","text":"<@U04A4K1NRT3>さんがチャンネルに参加しました","ts":"1667815968.901369","type":"message","user":"U04A4K1NRT3"}

jq で見やすくしてあげるとこのような内容になっていました。

{
  "blocks": [
    {
      "type": "rich_text",
      "block_id": "IMzDL",
      "elements": [
        {
          "type": "rich_text_section",
          "elements": [
            {
              "type": "text",
              "text": "テスト書き込みです"
            }
          ]
        }
      ]
    }
  ],
  "client_msg_id": "9f75e39d-3c7a-4c63-9206-0fa9ad39ec58",
  "text": "テスト書き込みです",
  "team": "T04AFLPMR16",
  "ts": "1667820261.475789",
  "type": "message",
  "user": "U04A4K1NRT3"
}
{
  "blocks": [
    {
      "type": "rich_text",
      "block_id": "IY=R",
      "elements": [
        {
          "type": "rich_text_section",
          "elements": [
            {
              "type": "text",
              "text": "テスト書き込み"
            }
          ]
        }
      ]
    }
  ],
  "client_msg_id": "4def0244-af04-4e95-8dc9-e5c0a98d23ac",
  "text": "テスト書き込み",
  "team": "T04AFLPMR16",
  "ts": "1667820254.200019",
  "type": "message",
  "user": "U04A4K1NRT3"
}
{
  "subtype": "channel_join",
  "text": "<@U04A4K1NRT3>さんがチャンネルに参加しました",
  "ts": "1667815968.901369",
  "type": "message",
  "user": "U04A4K1NRT3"
}

AppFlow による Slack から S3 へのデータ転送が確認できました!

終わりに

Amazon AppFlow 入門として Slack から S3 へのデータ転送を行うフローを作成してみました。フローを作成さえできればマネージドでいい感じに転送できるのはすごいですね。

AppFlow としては、作成するリソースは以下のみでシンプルではありました。

  • コネクタプロパティ(接続)
  • フロー

その代わり Slack 側の設定は慣れていないこともあり少し手間取ってしまいました。連携する SaaS アプリケーションによって必要となる設定は変わってくるかと思いますので、用いるアプリケーションに応じてドキュメント等をよく確認してお試しください。

AppFlow 入門を考えている方の参考になれば幸いです。

以上、 チバユキ (@batchicchi) がお送りしました。