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
参考