edit-icon download-icon

よくある質問

最終更新日: Jun 22, 2018

よくある質問

FC のプログラミング

サポートされているプログラミング言語以外の C ++ などのコードをどのように実行できますか。

今後、お客様からの機能のリクエストに基づいてサポート対象言語を増やしていく予定です。現在サポートされていない言語でコードが記述されている場合は、次の方法をお試しください。

  • FC でサポートする言語でコードを書き換える。Node.js と Python には幅広いライブラリが用意されており、開発の点では効率性に優れています。
  • C/C++ プログラムを実行ファイルにコンパイルし、システム呼び出しによる fork でファイルを実行する。
  • C/C++ モジュールを共有ライブラリとしてコンパイルし、Python でバインディングしてライブラリを使用する。

次の表に、これらの方法の利点と欠点を示します。

構築方法 実装の難しさ パフォーマンスの低下 利用イメージ
ロジックの書き換え 論理的複雑性に依存 言語と利用イメージに依存 比較的シンプルなビジネスロジックに適用可能
Fork 実行ファイル 非レイテンシに敏感な関数に適用可能。たとえばバッチ処理
共有ライブラリをインポートする レイテンシに敏感な関数に適用可能

Docker は現在、非常に人気があります。FC がカスタム Docker イメージをサポートしていないのはなぜですか。

リアルタイムスケーラビリティを確保するには、システムが短時間でコンテナーを起動する必要があります。サイズの大きいイメージのダウンロードには数秒かかる場合があり、パフォーマンスが許容範囲を超えてしまいます。お客様のアプリケーションをマイクロサービスとして開発し、関数を分離して、各関数の責任を明確にすることをお勧めします。この場合、一般的に関数コードには複雑な依存関係が含まれないためコードの構築が簡単になります。

依存関係を自動的にインストールする方法について知りたい。

Function Compute では、すべての依存関係を含む zip ファイルでコードをアップロードする必要があります。依存関係の管理方法は、言語によって異なります。たとえば、Node.js では、依存関係のあるパッケージを npm を使用してコードディレクトリにインストールし、zip に圧縮した後、その zip ファイルを使用して関数を作成または更新します。CLI ツール fcli を利用して、依存関係のインストールと zip 圧縮を行うこともできます。詳細な手順については、 をご参照ください。

関数の呼び出し

“許可が拒否されました” エラーをローカル環境ではなく FC から受け取るのはなぜですか。

許可が拒否されました というエラーは、特に Windows の zip 処理中に発生する可能性があります。zip ツールの中には元のファイルの許可を保持していないものがあります。zip が破損しているか、または許可の問題が発生した場合、FC は 許可が拒否されましたを返します。zip パッケージ内のすべてのファイルに許可 755 または 664 が設定されていることを確認してください。

アプリケーションで大きなファイルが生成されたり、大容量が必要になる場合はどうすればよいですか。ディスク容量をどのように増やせますか。

512 MB の一時ストレージ容量を関数実行に使用できます。この容量で不十分な場合は、ストリーミングパターンを使用してデータを処理することを検討してください。 では、ストリーム処理の使用により、関数のメモリ消費量を 1 GB から 256 MB に、所要時間を数分から 10 秒に削減することが可能です。

関数の呼び出しに消費されるメモリ量に関する情報はどこで取得できますか。

最大メモリ消費量などの情報は、Sync 呼び出しの LogResult ヘッダーで入手できます。または、リソース消費の Cloud Monitoring Service (CMS) メトリックを確認することもできます。

1 つの関数が別の関数を呼び出すことはできますか。

関数が別の関数を呼び出すことは可能です。FC Invoke Function API を使用して、指定した関数を呼び出すことができます。

無限ループを引き起こす関数呼び出しを強制終了するにはどうすればよいですか。

無限ループには次の 2 種類があります。1) 1 つの関数のロジックによって発生する無限ループ。2) 複数の関数の呼び出しで発生する、中止できない無限の再帰。たとえば、関数 A が関数 B を呼び出し、関数 B が関数 A を呼び出すという場合です。1 番目のケースの方が対処は簡単です。関数がタイムアウトすると、実行が自動的に終了してタイムアウトエラーメッセージが返され、それ以上の経済的損失が発生することはありません。2 番目のケースは問題となる可能性があります。このような種類の呼び出しはサービスで許可されているからです。この場合、関数レベルのメトリックに基づくモニタリングアラームを設定する必要があります。さらに、経済的損失を管理できるように、同時呼び出し制限 を適用することができます。

ユーザーあたりのデフォルトの最大同時呼び出し制限は 100 です。これは、サービスが 1 秒あたり最大 100 件のリクエストを処理できるという意味でしょうか。

QPS (リクエスト/秒) は、ある程度は最大同時呼び出し制限と関連していますが、別の概念です。QPS は次の式で見積もることができます。QPS * 関数の所要時間 = 最大同時呼び出し数。たとえば、1 秒あたり 10,000 件のリクエストを予定しており、リクエストの平均処理時間が 1 秒の場合、10,000 を超える同時呼び出し数が必要になります。リクエストの平均処理時間が 10 ミリ秒の場合は、10,000 * 0.01 (秒) = 100 を超える同時呼び出し数が必要になります。詳細は、関連するドキュメント をご参照ください。また、同時呼び出し数は、無限の呼び出しの再帰などで予期しない料金が発生するのを防ぐために設定されます。デフォルトが適切でない場合は、最大値を調整できますのでチケットセンターで起票してください。

実行環境は分離されていて安全ですか。どのように保証されますか。

FC は、セキュリティを、プロダクトおよびシステム設計のあらゆる局面で最優先課題と捉えています。関数の実行環境は、Alibaba Cloud ECS インスタンスと同じレベルで分離されます。つまり、コンテナーレベルではなく仮想マシンレベルで分離されます。さらに、関数のセキュリティを保証するために、ネットワーク、ストレージ、コード、および DDoS 攻撃対策について完全な保護を提供します。

パフォーマンス

実行環境は関数が返された後にリリースされますか。最後の呼び出しでバッファリングされたリソースまたはステータスを再利用することはできますか。

関数はコンテナーの内部で実行されます。コンテナーは関数が返された後すぐにはリリースされません。コンテナーは、一定期間リクエストが受信されなかったときにリリースされます。リクエストが連続的に受信されている場合、関数は永続的と見なされます。したがって、パフォーマンスを最適化するためにグローバル変数などのリソースをバッファリングできます。ただし、プログラムの正当性について、バッファリングが常に使用可能であるという前提に依存しないでください。たとえば、コンテナーやサーバーがダウンすると、バッファリングされたデータを使用できなくなる可能性があります。

ログ記録とモニタリング

関数の実行によって生成されたログをダウンロードするにはどうすればよいですか。

ログが Log Store (Alibaba Cloud Log Service) に保存されている場合は、Log Service API を使用して関連するコンテンツを表示およびダウンロードできます。

関数の呼び出しが成功したのに、呼び出し回数などのメトリックがクラウドのモニタリングコンソールに表示されないのはなぜですか。

ご使用のアカウントがサブアカウントか、またそのアカウントに少なくとも Cloud Monitoring Service の読み取り専用アクセス許可があるかを確認してください。

リソースアクセス

FC は RDS データベースにどのようにアクセスしますか。

FC コンテナーは固定 IP では実行されないため、すべての IP からのアクセスを許可することが必要になります。しかし、これはセキュリティリスクとなる可能性がありお勧めできません。FC は、ユーザーの VPC 内のリソースをサポートします。機能が使用可能になると、FC のアクセス許可を付与することで、ユーザーは VPC 内のリソースに安全にアクセスできます。

関数コンテキストパラメーターから取得したアクセスキー ID/秘密鍵 ID を使用したときに、 “AccessKeyID が存在しません” というエラーが表示されるのはなぜですか。

関数コンテキストパラメーターは、Access Key ID、Access Key Secret、security tokenの 3 つで構成され、Alibaba Cloud リソースにアクセスするための一時的な認証情報を提供します。“security token” も指定されていることを確認してください。Python で OSS にアクセスするには、次のコードをご覧ください。

  1. import json
  2. import oss2
  3. def my_handler(event, context):
  4. evt = json.loads(event)
  5. creds = context.credentials
  6. # Do not forget to fill out "security_token"!
  7. auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)
  8. bucket = oss2.Bucket(auth, evt['endpoint'], evt['bucket'])
  9. bucket.put_object(evt['objectName'], evt['message'])
  10. return 'success'