指定ログイン情報(Named Credentials)を使用してSalesforce ApexからAWS APIをコールする

# 概要

従来から指定ログイン情報(Named Credentials)という仕組みはありましたが、設定方法が変更になっています。
シンプルな例で、AWS APIをコールアウトする設定をし、動作を試してみます。

#  試す内容

新しい指定ログイン情報を設定し、開発者コンソールから匿名ApexでS3バケットリストAPIをコール、レスポンスを確認してみます。
検証環境は DeveloperEdition組織 Summer '23 です。

# 設定手順

## IAMユーザーを作成(AWS側)

AWSアカウント内へIAMユーザーを作成します。
許可オプションは「ポリシーを直接アタッチ」を選択、ポリシーは 「AmazonS3ReadOnlyAccess」をアタッチしました。
ユーザー作成後、アクセスキーを作成、アクセスキーとシークレットアクセスキーを控えておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53115/3df64537-ae58-c68f-7a57-b865ea7bf069.png)

## 外部ログイン情報を作成

設定から[指定ログイン情報] ページへアクセス、[外部ログイン情報] タブをクリックし、[新規] ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53115/6356c25e-abb1-a135-882b-b9d3af4b5176.png)

表示ラベルと名前へ 「S3Access」と指定し、認証プロトコルへ 「AWS署名バージョン4」を選択します。
サービスへ 「s3」、地域へ「us-east-1」を入力し、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53115/2c016d3b-ca64-bc22-94bd-f2bf410feb13.png)

続いてプリンシパルセクションの[新規]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53115/ba052e9b-82df-b5a7-4aeb-32010147cfb5.png)

パラメータ名へ「S3ControlUser」を入力、アクセスキーとアクセスの秘密へそれぞれIAMユーザーのアクセスキー、シークレットアクセスキーを入力し、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53115/765a9fdb-461c-21f6-9090-c1bcc47c5310.png)

## 指定ログイン情報を作成

設定から[指定ログイン情報] ページへアクセス、[指定ログイン情報] タブの[新規] ボタンをクリックします。
表示ラベル、名前へ 「S3Access」、URLへ 「https://s3.amazonaws.com 」を入力します。
外部ログイン情報へは上記で設定した「S3Access」を選択します。
その他の項目はデフォルトのまま、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53115/489830a7-835a-a1df-bf3f-58f17b1df6a1.png)

## 外部ログインプリンシパルのアクセス許可

実行するセールスフォースユーザへ外部ログインプリンシパルのアクセス許可設定を行います。
下記設定の新規権限セット `S3AccessPermset` を作成し、対象ユーザへ割り当てます。

####  外部ログイン情報プリンシパルアクセス

上記で設定した外部ログイン情報＋プリンシパルの設定が表示されますので選択して追加、保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53115/c19dad43-fe0b-0de9-9591-d014d812c16d.png)

####  ユーザの外部ログイン情報オブジェクト権限

すべて許可設定します。
（設定時にシステム管理者権限等、「すべてのデータの編集」が有効になっている場合は不要ですが、一般的な利用ユーザの場合は必要です）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53115/4d8bc24c-24f6-630e-8390-b05b1d649b70.png)


# 動作確認

デベロッパーコンソールの Anonymous WindowからApexコードを実行して確認します。
（従来の指定ログイン情報と記述は同じで良さそうです）

```apex
HttpRequest req = new HttpRequest();
req.setEndpoint('callout:S3Access/');
req.setMethod('GET');

Http http = new Http();
HttpResponse res = http.send(req);
System.debug(res.getBody());
```

ログを確認すると（長いXMLなので途中で切れますが）レスポンスを確認できます。
また、デバッグログでNamedCalloutが実行されて、Statusコードが200であることなども確認可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53115/eaedd370-c076-b79e-3c63-4be1f8d2fee3.png)

# 感想

従来の指定ログイン情報(NamdeCredentials)設定に比べると設定項目が分離し、権限も含めて各要素を関連付ける仕組みとなっています。シンプルに設定箇所が多く、関連を把握するのが面倒な印象を受けました。
ただ、権限をより明確に割り当てられるのと、AWSコールアウトについてはAssumeRoleできるようなので機能としてはパワーアップしていますし、柔軟で細かい設定が可能になっていると思います。

現時点では、従来機能での設定も引き続き利用可能、新たに設定することもできますが、非推奨となっているため、移行を検討する必要がありますね。


# その他補足

従来の設定は、設定画面上 「種別：旧」 と表示、区別されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53115/08c6612d-376e-c142-86ef-7955555ffa03.png)

# リンク

- Salesforceヘルプ:指定ログイン情報と外部ログイン情報
    - https://help.salesforce.com/s/articleView?id=sf.nc_named_creds_and_ext_creds.htm&type=5
- Amazon S3 APIリファレンス
    - https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html
- 従来機能で試した過去のポスト
    - https://qiita.com/shinsaka/items/f11cf54373c4fe49b0a9
- Winter '23から変更になったということのようですね。
    - https://developer.salesforce.com/blogs/2022/10/announcing-the-next-generation-of-named-credentials