amazon comprehendをPHPで動かす

## はじめに
個人開発しているwebアプリで機械学習による自然言語処理を使った機能を実装するため、phpから[amazon comprehend](https://docs.aws.amazon.com/ja_jp/comprehend/)を使えるようにしましたが、なかなか苦戦したのでやり方を残しておきます。

## 対象者
- amazon comprehendを外部からweb apiのように使いたい人

## 結論
phpから感情分析が行えるようになりました
```php:example.php
<?php

require 'vendor/autoload.php';
use Aws\Comprehend\ComprehendClient;

$client = new ComprehendClient([
    'region' => 'ap-northeast-1',
    'version' => 'latest'
]);

$result = $client->detectSentiment([
    'LanguageCode' => 'ja', // REQUIRED
    'Text' => '私はとても楽しいです', // REQUIRED
]);

echo $result;
```
出力
```
Model Data
----------
Data can be retrieved from the model object using the get() method of the
model (e.g., `$result->get($key)`) or "accessing the result like an
associative array (e.g. `$result['key']`). You can also execute JMESPath
expressions on the result data using the search() method.

{
    "Sentiment": "POSITIVE",
    "SentimentScore": {
        "Positive": 0.9998538494110107,
        "Negative": 3.527790249790996e-5,
        "Neutral": 8.529981278115883e-5,
        "Mixed": 2.560075699875597e-5
    },
    "@metadata": {
        "statusCode": 200,
        "effectiveUri": "https:\/\/comprehend.ap-northeast-1.amazonaws.com",
        "headers": {
            "x-amzn-requestid": "cc775bfc-0b24-42d5-babb-020975931ba2",
            "content-type": "application\/x-amz-json-1.1",
            "content-length": "165",
            "date": "Sat, 21 Oct 2023 09:50:58 GMT"
        },
        "transferStats": {
            "http": [
                []
            ]
        }
    }
}
```

## 手順

### 1. AWSアカウントの作成
[リンク](https://aws.amazon.com/jp/register-flow/)から作成しましょう。余談ですが、awsの公式ドキュメントは公式が用意した日本語訳がめちゃくちゃなときがあるので、そういうときは英語で表示してchromeのgoogle翻訳にかけたほうが多少読みやすいと思います。
その後、[IAMユーザーを作成](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html)します。これは、権限が制限されたユーザーで普段はこちらのユーザーを使用します。

### 2. IAM Identity Centerの設定
[ここ](https://docs.aws.amazon.com/ja_jp/singlesignon/latest/userguide/getting-started.html)に書いてあるとおりにステップ1~6を実行します。
IAM Identity Centerは、awsの認証機能であり、ここで設定したユーザーに外部からアクセスすることで、外部からawsのもろもろのサービスを使う権限を得ます。

### 3. aws sdk for phpのインストール
composerを使用している場合は以下のコマンドでインストールできます。
```composer require aws/aws-sdk-php```
そのほかのインストール方法は[こちら](https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/getting-started_installation.html)に記載されています。

### 4. 認証情報の設定
2で設定したユーザーにアクセスするための認証情報をphpファイルで取得する必要があります。
認証情報であるアクセスキーなどは流出してしまうとまずいため、ファイルに直書きすることはやめましょう。代わりにconfigファイルやcredentialsファイルを作成しそこに書いていきます。作成場所は[環境により異なり](https://docs.aws.amazon.com/ja_jp/sdkref/latest/guide/file-location.html)ますが、Linuxでは`~/.aws/config`、`~/.aws/credentials`です。
#### config
```config
[profile dev]
sso_session = my-sso
sso_account_id = {access_id}
sso_role_name = PowerUserAccess

[sso-session my-sso]
sso_region = {region}
sso_start_url = {start_url}
sso_registration_scopes = sso:account:access
```
#### credentials
```
[default]
aws_access_key_id={access_key_id}
aws_secret_access_key={access_key}
```
それぞれのファイルの中身はこのようにして、{}で囲われた部分のみ自身のユーザーの情報に書き換えてください。書き換える部分の情報は、手順2で操作していたIAM Identity Centerのダッシュボード画面の右側にあるAWSアクセスポータルのURLを踏んで、登録したユーザーでログインした画面（下画像）のCommand line or programmatic accessから確認できます。
![aws認証情報確認方法.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577368/28a4dc53-bc7d-61e8-abbf-97064b5c500d.png)
sso_account_idのみ書かれていませんが、ここは上記画像の黒塗りされた部分に書かれた12桁の数字を入れてください。
また、ユーザーにMFAを登録しているとsession_tokenの情報も認証に必要になるようです。

### 5. 動作確認
[結論](#結論)に載せたexample.phpを作成し実行して、きちんと結果が出力されれば認証がうまくいっています。

## おわりに
今回はamazon comprehendを使ってphpファイルから自然言語処理を行いました。ただ、amazon comprehendは使いすぎると料金が発生するので公開するアプリに組み込む際は十分に注意してください。無料で自然言語処理をする方法としてgoogle colaboratoryをapiサーバーのように使う方法も考えましたが、セッションが定期的に切れてしまう使用が厄介そうだったので諦めました。定期的にセッションを起動する機能が追加されれば使えそうなんですけどね。（かなり力技ですが、[セッションを起動し続ける方法](https://qiita.com/shoyaokayama/items/8869b7dda6deff017046)もあるようです）


## 参考記事
[プログラミング初心者のためのQiita記事投稿テンプレート](https://qiita.com/YutaManaka/items/611069745ff0f68af879)