[Salesforce] レコードのデータを取得し、CSVにしてS3にアップロードする

AWSで利用する事を想定し、レコードの内容をCSVファイルにしてS3にアップロードしてみたメモ。

SF内にCSVを生成して、そのファイルをS3にアップロード、すればいいかと思っていたが、直接CSVの内容をBodyに入れて送ってしまうことで、直接CSVファイルをS3に送信してしまう事が出来た。

参考コード

参考、というか、以下のコードをそのまま利用させてもらった。

CSV送信

上記サンプルはテキストファイルになるので、CSVを保存するように変更。
具体的には、Bodyの内容をカンマ区切りにし、ファイルの拡張子をcsvにし、Content-Typeをtext/csvにする、だけ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public with sharing class SaveCSVSample {
  public SaveCSVSample() {
      String csv_body = 'テスト1,テスト2,テスト3\r\nサンプル1,サンプル2,サンプル3';

      String fileName = 'test.csv';

      String accessId = 'xxx';
      String secretKey = 'xxx';
      String bucketName = 'user';
      String S3_Domain = 's3-ap-northeast-1.amazonaws.com';

      String dateString = Datetime.now().formatGmt('EEE, dd MMM yyyy HH:mm:ss Z');
      String stringToSign = 'PUT\n\ntext/csv\n' + dateString +'\n/' + bucketName + '/' + fileName;
      Blob mac = Crypto.generateMac('hmacSHA1',  Blob.valueOf(stringToSign), Blob.valueOf(secretKey));
      String signature = EncodingUtil.base64Encode(mac);

      HttpRequest req = new HttpRequest();
      req.setEndPoint('https://' + bucketName + '.' + S3_Domain + '/' + fileName);
      req.setHeader('Content-Type', 'text/csv');
      req.setHeader('Content-Length', String.valueOf(csv_body.length()));
      req.setHeader('Host', bucketName + '.' + S3_Domain);
      req.setHeader('Date', dateString);
      req.setHeader('Authorization','AWS ' + accessId + ':' + signature);
      req.setBody(csv_body);
      req.setMethod('PUT');

      Http httpConnection = new Http();
      HTTPResponse res = httpConnection.send(req);

      System.debug(res);
  }
}

アップされたCSVは、改行コード \r\n 、文字コードは、UTF-8となった。

これでS3側にCSVファイルを作成出来るので、あとはレコードをSOQLで取得し、Bodyをカンマ区切りで作成してやればよいだけ。

環境情報

この例では、アクセスキーなどはベタで書いてしまっているが、実際にはカスタム設定などで作成し取得するようにした方がよい。
それだと、sandboxと本番でS3の投げ先も変更出来る。

エンドポイント

送信先に設定している、S3_Domainは現状、日本リージョンのもの。
各サービスのリージョン別のエンドポイントは以下を参考。
http://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html#s3_region

ガバナ制限

ファイルサイズが3MBを超えるとApexの実行時ガバナ制限に抵触する
http://www30304u.sakura.ne.jp/blog/?p=1808

参考

   このエントリーをはてなブックマークに追加