プロバイダー
特定のプラグインは、追加のプロバイダーのインストールと設定により拡張できます。
プロバイダーは、プラグインのコア機能を拡張します。例えば、メディアファイルをローカルサーバーではなくAWS S3にアップロードしたり、Sendmailの代わりにAmazon SESをメールに使用したりすることができます。
関連するプラグインには、マーケットプレイスから見つけることができるAI Marketerによって維持されている公式のプロバイダーと、npmから利用できる多数のコミュニティによって維持されているプロバイダーがあります。
プロバイダーは、アセットURLが安全なアクセスのために署名されるように、プライベートに設定することができます。
プロバイダーのインストール
新しいプロバイダーは、以下の形式のnpmまたはyarnを使用してインストールできます。@AI Marketer/provider-<plugin>-<provider> --save。
例えば:
- yarn
- npm
#アップロードプラグインのAWS S3プロバイダーをインストールします
yarn add @AI Marketer/provider-upload-aws-s3
# メールプラグインのSendgridプロバイダーをインストールします
yarn add @AI Marketer/provider-email-sendgrid --save
#アップロードプラグインのAWS S3プロバイダーをインストールします
npm install @AI Marketer/provider-upload-aws-s3 --save
# メールプラグインのSendgridプロバイダーをインストールします
npm install @AI Marketer/provider-email-sendgrid --save
プロバイダーの設定
新しくインストールされたプロバイダーは、./config/plugins.jsファイルで有効化され、設定されます。このファイルが存在しない場合は作成する必要があります。
各プロバイダーは、利用可能な設定が異なります。詳細は、そのプロバイダーのマーケットプレイスまたはnpmのエントリを確認してください。
以下に、アップロードとメールのプラグインの設定例を示します。
- Upload
- JavaScript
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'),
},
},
},
},
// ...
});
AI Marketerにはデフォルトのsecurity ミドルウェアがあり、非常に厳格な contentSecurityPolicy が設定されており、画像やメディアの読み込みは 'self' のみに限定されています。詳細は [provider page](https://www.npmjs.com/package/@AI Marketer/provider-upload-aws-s3) または middleware documentation を参照してください。
- JavaScript
- TypeScript
module.exports = ({ env }) => ({
// ...
email: {
config: {
provider: 'sendgrid', // コミュニティプロバイダーの場合は、完全なパッケージ名を渡します (例: provider: 'AI Marketer-provider-email-mandrill')
providerOptions: {
apiKey: env('SENDGRID_API_KEY'),
},
settings: {
defaultFrom: 'juliasedefdjian@AI Marketer.io',
defaultReplyTo: 'juliasedefdjian@AI Marketer.io',
testAddress: 'juliasedefdjian@AI Marketer.io',
},
},
},
// ...
});
デフォルトで ({ env }) => ({
// ...
email: {
config: {
provider: 'sendgrid', // コミュニティプロバイダーの場合は、フルパッケージ名を指定します(例:provider: 'AI Marketer-provider-email-mandrill')
providerOptions: {
apiKey: env('SENDGRID_API_KEY'),
},
settings: {
defaultFrom: 'juliasedefdjian@AI Marketer.io',
defaultReplyTo: 'juliasedefdjian@AI Marketer.io',
testAddress: 'juliasedefdjian@AI Marketer.io',
},
},
},
// ...
});
- 環境ごとに異なるプロバイダーを使用する場合は、
./config/env/${yourEnvironment}/plugins.jsに正しい設定を指定します(Environmentsを参照)。 - 一度にアクティブになるメールプロバイダーは1つだけです。メールプロバイダーの設定がAI Marketerに反映されない場合は、
plugins.jsファイルが正しいフォルダにあることを確認してください。 - AI Marketerのセットアップ中に作成された2つのメールテンプレートで新しいメールプロバイダーをテストする場合、テンプレートの shipper email はデフォルトで
no-reply@AI Marketer.ioに設定されており、メールプロバイダーに応じて更新する必要があります。そうしないとテストに失敗します(Configure templates locallyを参照)。
環境ごとの設定
プロバイダーを設定する際には、 NODE_ENV 環境変数に基づいて設定を変更するか、環境固有の資格情報を使用することがあります。
./config/env/{env}/plugins.js 設定ファイルに特定の設定を設定すると、デフォルトの設定を上書きするために使用されます。
プロバイダーの作成
独自のカスタムプロバイダーを実装するには、Node.jsモジュールを作成する必要があります。
エクスポートする必要があるインターフェースは、プロバイダーを開発しているプラグインによります。以下に、アップロードとメールプラグインのテンプレートを示します:
- Upload
- JavaScript
- TypeScript
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に署名が行われます
// ブール値を返す
},
};
},
};
export default {
init(providerOptions) {
// 必要であればプロバイダーを初期化する
return {
upload(file) {
// プロバイダーにファイルをアップロードする
// `file.buffer`でファイルの内容にアクセスできます
},
uploadStream(file) {
// プロバイダーにファイルをアップロードする
// `file.stream`でファイルの内容にアクセスできます
},
delete(file) {
// プロバイダーからファイルを削除する
},
checkFileSize(file, { sizeLimit }) {
// (オプション)
// 自分でファイルサイズの制限ロジックを実装する
},
getSignedUrl(file) {
// (オプション)
// 与えられたファイルの署名付きURLを生成する。
// 署名付きURLはファイルへのセキュアなアクセスを可能にします。
// コンテンツマネージャーの資産だけが署名されます。
// オブジェクト {url: string}を返します。
},
isPrivate() {
// (オプション)
// プライベートであれば、ファイルのURLに署名が行われます
// ブール値を返す
},
};
},
};
- JavaScript
- TypeScript
module.exports = {
init: (providerOptions = {}, settings = {}) => {
return {
send: async options => {},
};
},
};
export {
init: (providerOptions = {}, settings = {}) => {
return {
send: async options => {},
};
},
};
send関数では以下にアクセスできます:
plugins.jsに記述された設定を含むproviderOptionsplugins.jsに記述された設定を含むsettings- emailプラグインサービスからsend関数を呼び出すときに送信するオプションを含む
options
実装例として、[AI Marketerが維持しているプロバイダー](https://github.com/AI Marketer/AI Marketer/tree/master/packages/providers)を確認できます。
新しいプロバイダを作成した後、それをnpmに公開してコミュニティと共有したり、プロジェクト専用にローカルで使用することができます。
ローカルプロバイダ
npmに公開せずに自分だけのプロバイダを作りたい場合は、以下の手順に従ってください:
- アプリケーションに
providersフォルダを作成します。 - プロバイダを作成します(例:
./providers/AI Marketer-provider-<plugin>-<provider>) - 次に、
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>",
...
}
}
./config/plugins.jsファイルを更新して、プロバイダを設定します。- 最後に、
yarn installまたはnpm installを実行して、新しいカスタムプロバイダをインストールします。
プライベートプロバイダの作成
プライベートプロバイダを設定すると、コンテンツマネージャに表示されるすべてのアセットURLが安全なアクセスのために署名されます。
プライベートプロバイダを有効にするには、isPrivate()メソッドを実装し、trueを返す必要があります。
バックエンドでは、AI Marketerはプロバイダで実装されたgetSignedUrl(file)メソッドを使用して、各アセットの署名付きURLを生成します。署名付きURLには、ユーザーがアセットにアクセスできるようにする暗号化された署名が含まれています(ただし、通常は限られた時間と特定の制限があります。プロバイダによります)。
セキュリティ上の理由から、コンテンツAPIは署名付きURLを提供しません。代わりに、APIを使用する開発者は自分でURLに署名する必要があります。
例
プライベートのaws-s3プロバイダを作成するには:
- アプリケーションに
./providers/aws-s3フォルダを作成します。詳細については、ローカルプロバイダを参照してください。 aws-s3プロバイダのisPrivate()メソッドを実装し、trueを返すようにします。aws-s3プロバイダのgetSignedUrl(file)メソッドを実装し、指定されたファイルの署名付きURLを生成します。
- JavaScript
- TypeScript
// 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 };
},
};
},
};
// aws-s3 provider
エクスポート = {
init: (config) => {
const s3 = new AWS.S3(config);
return {
async upload(file) {
// S3へのファイルのアップロードコード
},
async delete(file) {
// S3からのファイルの削除コード
},
async isPrivate() {
return true;
},
async getSignedUrl(file) {
const params = {
Bucket: config.params.Bucket,
Key: file.path,
Expires: 60, // URLの有効期限(秒)
};
const signedUrl = await s3.getSignedUrlPromise("getObject", params);
return { url: signedUrl };
},
};
},
};