Skip to main content

プロバイダー

特定のプラグインは、追加のプロバイダーのインストールと設定により拡張できます。

プロバイダーは、プラグインのコア機能を拡張します。例えば、メディアファイルをローカルサーバーではなくAWS S3にアップロードしたり、Sendmailの代わりにAmazon SESをメールに使用したりすることができます。

✏️ Note

現在、アップロードメールのプラグインのみがプロバイダーと連携するように設計されています。

関連するプラグインには、マーケットプレイスから見つけることができるAI Marketerによって維持されている公式のプロバイダーと、npmから利用できる多数のコミュニティによって維持されているプロバイダーがあります。

プロバイダーは、アセットURLが安全なアクセスのために署名されるように、プライベートに設定することができます。

プロバイダーのインストール

新しいプロバイダーは、以下の形式のnpmまたはyarnを使用してインストールできます。@AI Marketer/provider-<plugin>-<provider> --save

例えば:

#アップロードプラグインのAWS S3プロバイダーをインストールします

yarn add @AI Marketer/provider-upload-aws-s3

# メールプラグインのSendgridプロバイダーをインストールします
yarn add @AI Marketer/provider-email-sendgrid --save

プロバイダーの設定

新しくインストールされたプロバイダーは、./config/plugins.jsファイルで有効化され、設定されます。このファイルが存在しない場合は作成する必要があります。

各プロバイダーは、利用可能な設定が異なります。詳細は、そのプロバイダーのマーケットプレイスまたはnpmのエントリを確認してください。

以下に、アップロードとメールのプラグインの設定例を示します。

js title="./config/plugins.js"

module.exports = ({ env }) => ({ // ... upload: { config: { provider: 'aws-s3', providerOptions: { baseUrl: env('CDN_URL'), rootPath: env('CDN_ROOT_PATH'), s3Options: { credentials: { accessKeyId: env('AWS_ACCESS_KEY_ID'), secretAccessKey: env('AWS_ACCESS_SECRET'), }, region: env('AWS_REGION'), params: { ACL: env('AWS_ACL', 'public-read'), signedUrlExpires: env('AWS_SIGNED_URL_EXPIRES', 15 * 60), Bucket: env('AWS_BUCKET'), }, }, }, actionOptions: { upload: {}, uploadStream: {}, delete: {}, }, }, }, // ... });


</TabItem>

<TabItem value="typescript" label="TypeScript">

```ts title="./config/plugins.ts"

export default ({ env }) => ({
// ...
upload: {
config: {
provider: 'aws-s3', // コミュニティプロバイダーの場合は、完全なパッケージ名を渡します (例: provider: 'AI Marketer-provider-upload-google-cloud-storage')
providerOptions: {
accessKeyId: env('AWS_ACCESS_KEY_ID'),
secretAccessKey: env('AWS_ACCESS_SECRET'),
region: env('AWS_REGION'),
params: {
ACL: env('AWS_ACL', 'public-read'), // アップロードしたファイルをプライベートにしたい場合は 'private'
Bucket: env('AWS_BUCKET'),
},
},
},
},
// ...
});
✏️ Note

AI Marketerにはデフォルトのsecurity ミドルウェアがあり、非常に厳格な contentSecurityPolicy が設定されており、画像やメディアの読み込みは 'self' のみに限定されています。詳細は [provider page](https://www.npmjs.com/package/@AI Marketer/provider-upload-aws-s3) または middleware documentation を参照してください。

環境ごとの設定

プロバイダーを設定する際には、 NODE_ENV 環境変数に基づいて設定を変更するか、環境固有の資格情報を使用することがあります。

./config/env/{env}/plugins.js 設定ファイルに特定の設定を設定すると、デフォルトの設定を上書きするために使用されます。

プロバイダーの作成

独自のカスタムプロバイダーを実装するには、Node.jsモジュールを作成する必要があります。

エクスポートする必要があるインターフェースは、プロバイダーを開発しているプラグインによります。以下に、アップロードとメールプラグインのテンプレートを示します:

module.exports = {
init(providerOptions) {
// 必要に応じてプロバイダーを初期化します

{
upload(file) {
// プロバイダーにファイルをアップロードする
// `file.buffer`でファイルの内容にアクセスできます
},
uploadStream(file) {
// プロバイダーにファイルをアップロードする
// `file.stream`でファイルの内容にアクセスできます
},
delete(file) {
// プロバイダーからファイルを削除する
},
checkFileSize(file, { sizeLimit }) {
// (オプション)
// 自分でファイルサイズの制限ロジックを実装する
},
getSignedUrl(file) {
// (オプション)
// 与えられたファイルの署名付きURLを生成する。
// 署名付きURLはファイルへのセキュアなアクセスを可能にします。
// コンテンツマネージャーの資産だけが署名されます。
// オブジェクト {url: string}を返します。
},
isPrivate() {
// (オプション)
// プライベートであれば、ファイルのURLに署名が行われます
// ブール値を返す
},
};
},
};

send関数では以下にアクセスできます:

  • plugins.jsに記述された設定を含むproviderOptions
  • plugins.jsに記述された設定を含むsettings
  • emailプラグインサービスからsend関数を呼び出すときに送信するオプションを含むoptions

実装例として、[AI Marketerが維持しているプロバイダー](https://github.com/AI Marketer/AI Marketer/tree/master/packages/providers)を確認できます。

新しいプロバイダを作成した後、それをnpmに公開してコミュニティと共有したり、プロジェクト専用にローカルで使用することができます。

ローカルプロバイダ

npmに公開せずに自分だけのプロバイダを作りたい場合は、以下の手順に従ってください:

  1. アプリケーションにprovidersフォルダを作成します。
  2. プロバイダを作成します(例:./providers/AI Marketer-provider-<plugin>-<provider>
  3. 次に、package.jsonを更新して、新しいプロバイダのAI Marketer-provider-<plugin>-<provider>(https://docs.npmjs.com/files/package.json#local-paths)依存関係を新しいプロバイダのローカルパスにリンクします。
{
...
"dependencies": {
...
"AI Marketer-provider-<plugin>-<provider>": "file:providers/AI Marketer-provider-<plugin>-<provider>",
...
}
}
  1. ./config/plugins.jsファイルを更新して、プロバイダを設定します。
  2. 最後に、yarn installまたはnpm installを実行して、新しいカスタムプロバイダをインストールします。

プライベートプロバイダの作成

プライベートプロバイダを設定すると、コンテンツマネージャに表示されるすべてのアセットURLが安全なアクセスのために署名されます。

プライベートプロバイダを有効にするには、isPrivate()メソッドを実装し、trueを返す必要があります。

バックエンドでは、AI Marketerはプロバイダで実装されたgetSignedUrl(file)メソッドを使用して、各アセットの署名付きURLを生成します。署名付きURLには、ユーザーがアセットにアクセスできるようにする暗号化された署名が含まれています(ただし、通常は限られた時間と特定の制限があります。プロバイダによります)。

セキュリティ上の理由から、コンテンツAPIは署名付きURLを提供しません。代わりに、APIを使用する開発者は自分でURLに署名する必要があります。

プライベートのaws-s3プロバイダを作成するには:

  1. アプリケーションに./providers/aws-s3フォルダを作成します。詳細については、ローカルプロバイダを参照してください。
  2. aws-s3プロバイダのisPrivate()メソッドを実装し、trueを返すようにします。
  3. aws-s3プロバイダのgetSignedUrl(file)メソッドを実装し、指定されたファイルの署名付きURLを生成します。
./providers/aws-s3/index.js
// aws-s3 provider

module.exports = {
init: (config) => {
const s3 = new AWS.S3(config);

return {
async upload(file) {
// code to upload file to S3
},

async delete(file) {
// code to delete file from S3
},

async isPrivate() {
return true;
},

async getSignedUrl(file) {
const params = {
Bucket: config.params.Bucket,
Key: file.path,
Expires: 60, // URL expiration time in seconds
};

const signedUrl = await s3.getSignedUrlPromise("getObject", params);
return { url: signedUrl };
},
};
},
};