SalesforceとAmazon S3を連携させてみた

## やりたいこと
Salesforceで扱うデータを耐久性のあるAWSのS3に保管したい。

## 参考にしたページ
- 公式のチュートリアル
    - ["JP Amazon Toolkit"](https://developer.salesforce.com/index.php?title=JP_Amazon_Toolkit&oldid=20419)
    - ["Installing Force for Amazon Web Services"](https://developer.salesforce.com/index.php?title=Installing_Force_for_Amazon_Web_Services&oldid=19955)
    - ["Using Force for Amazon Web Services"](https://developer.salesforce.com/index.php?title=Using_Force_for_Amazon_Web_Services&oldid=19354)

## 用意したもの

- [SalesforceのDeveloper Edition](https://developer.salesforce.com/signup)
- AWSアカウント
- apexコードを編集する手段
    - [ForceCode for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=JohnAaronNelson.ForceCode)
    - [Force.com IDE](https://help.salesforce.com/articleView?id=000216209&language=ja&type=1)
    - 開発者コンソール


本記事は以下の環境で記載する。

- Salesforce Developer Edition Winter 2018 (Lightning Experience)
- ForceCode for Visual Studio Code

## 作業手順

### Force.com for Amazon Web Servicesのインストール

["Installing Force for Amazon Web Services"](https://developer.salesforce.com/index.php?title=Installing_Force_for_Amazon_Web_Services&oldid=19955)にアクセスし、Install Toolkit from AppExchangeの [1] をクリックしてSalesforceにToolkitをインストール。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235642/cb74a009-7553-cfda-e043-cb9618e9cfa5.png)


### リモートサイトの設定
Salesforceにログインし、「設定」→「セキュリティ」→「リモートサイトの設定」と進み、「新規リモートサイト」をクリックする。
なお、リモートサイトのURLはリージョンも指定する形で入力する。
例えば、アジアパシフィック(東京)なら`https://s3.ap-northeast-1.amazonaws.com`となる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235642/480bf52f-0eb5-16ce-03aa-06079ae63523.png)



### Force.com for Amazon Web Services の設定
「アプリケーションランチャー」→「AWS Credentials」と進み、「新規」でAWSの資格情報を登録する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235642/ad93de09-399f-1f07-8df9-2cf62e3a2d6c.png)

| 項目 | 値 |
|:-:|:-:|
| Credential Name | 任意の名前 |
| Key | IAMユーザのアクセスキー |
| Secret | IAMユーザのシークレットアクセスキー |



# カスタムオブジェクトの編集
「オブジェクトマネージャ」→「AWS S3 Object」→「ボタン、リンク、およびアクション」→「新規 (の▼) 」→「編集」

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235642/226d27e4-97ef-095d-f0a3-1873d4ea49bb.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235642/afd6d43e-d2f6-06a7-b863-f902ab7ffddc.png)

「Salesforce Classicの上書き」を以下のように設定。

- 「Visualforceページ」を選択
- 「news3object」を設定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235642/d293155a-32a9-f586-b130-82a5c95cdd43.png)

## ForceCode for Visual Studio Codeの設定

以下の記事を参考に設定します。
[Visual Studio Code で Salesforce 開発環境を作る](https://qiita.com/u1_nsnl/items/e355650e6b1c740440f0)



## apexコードの変更

`AWSCredentialName`の変更と`リージョン情報`の追記を行う。

**classes**

- AWS_ExplorerCon.cls
    - 3行目

```:3行目
private String AWSCredentialName = '設定したCredential Name; //Modify this string variable to be the name of the AWS Credential record that contains the proper AWS keys and secret
```

- AWS_S3_ExampleController.cls
    - 41行目
    - 473行目

```:41行目
private String AWSCredentialName = '任意の名前'; //Modify this string variable to be the name of the AWS Credential record that contains the proper AWS keys and secret
```

```:473行目
String url = 'http://'+bucketToList+'.s3-ap-northeast-1.amazonaws.com/'+filename+'?AWSAccessKeyId='+as3.key+'&Expires='+Lexpires+'&Signature='+signed;
```

- S3.cls
    - 178行目
    - 1407行目

```:178行目
public String endpoint_x = 'https://s3-ap-northeast-1.amazonaws.com/soap';
```

```:1407行目
req.setEndpoint('https://s3-ap-northeast-1.amazonaws.com/soap');
```

- S3FormController.cls
    - 4行目

```:4行目
private String AWSCredentialName = '設定したCredential Name'; //Modify this string variable to be the name of the AWS Credential record that contains the proper AWS keys and secret
```

**pages**

- news3object2.page
    - 6行目

```:6行目
action="https://s3-ap-northeast-1.amazonaws.com/{!AWS_S3_Object__c.Bucket_Name__c}"
```

- s3Preview.page
    - 3行目

```:3行目
<script>window.location.href="https://s3-ap-northeast-1.amazonaws.com/{!AWS_S3_Object__c.Bucket_Name__c}/{!AWS_S3_Object__c.File_Name__c}";</script>
```

**カスタムオブジェクト**

- Preview Link
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235642/f52df1ed-858b-76a7-f6a7-0cd42a62910c.png)

```:数式オプション
HYPERLINK('https://s3-ap-northeast-1.amazonaws.com/'& Bucket_Name__c &'/'& File_Name__c , 
'https://s3-ap-northeast-1.amazonaws.com/' & Bucket_Name__c &'/'& File_Name__c )
```

以上です。




## 参考リンク
- [Force.comからAmazon EC2とS3を利用する方法](http://blog.flect.co.jp/salesforce/2010/09/forcecomamazon-.html)
- [Problem to run Amazon web service S3 integration code supported by Salesforce](https://salesforce.stackexchange.com/questions/31523/problem-to-run-amazon-web-service-s3-integration-code-supported-by-salesforce)
- [[SFDC]Force.com for Amazon Web Servicesを試す](http://www30304u.sakura.ne.jp/blog/?p=465)