Azure Functions をAzure 以外のクラウドプロバイダーで動かしてみる。

はじめに

これはServerless Advent Calendar 2020に12月6日分になります。

内容手にはServerless MeetupやJAZUGで登壇した内容を記事化したものになります。

どうやって動かすか

現状、Azure FunctionsをAzure以外で動作させる方法としてはKnativeがありますが、今回はKEDAで動作させる方法になります。

実際にAWS上でAzure Functionsを動作させることも可能で動作報告もあります。

余談:KnativeでKnative Lambda Runtime(AWS Lambda互換) をGKEで動作している報告もあります。

オープンソースで公開されているがGoogleが主体で開発を進めています。
CNCF(Cloud Native Computing Foundation)へは加わらない方針だそうです。

KEDA

今回はKEDA(Kubernetes Event-driven Autoscaling)を利用しています。

イベント駆動型オートスケーラーです。
MicrosoftとRedHatで共同開発、CNCFに採用されました。
オンプレミス、Azure Kubernetes Service、RedHat OpenShiftなどの環境で利用可能です。
現在、Version 2.0 (2020/11/17)でリリーススピードが2~3か月です。
構成がシンプルで導入が楽です。

  • Helm charts
  • Operator Hub
  • YAML declarations

仕組み

主に2つの仕組みがあります。

Agent
Kubernetes Deploymentsのアクティブ化、非アクティブ化を行います。イベントが無い場合にはゼロスケールします。
0->1 or 1->0

Metrics
メトリクスサーバーとして機能し、Horizo​​ntalPod Autoscalerと連携します。様々なメトリクスに対応します。
1->n or n->1

対応するスケーラー

  • ActiveMQ Artemis
  • Apache Kafka
  • AWS CloudWatch
  • AWS Kinesis Stream
  • AWS SQS Queue
  • Azure Blob Storage
  • Azure Event Hubs
  • Azure Log Analytics
  • Azure Monitor
  • Azure Service Bus
  • Azure Storage Queue
  • CPU
  • Cron
  • External
  • External Push
  • Google Cloud Platform‎ Pub/Sub
  • Huawei Cloudeye
  • IBM MQ
  • Liiklus Topic
  • Memory
  • Metrics API
  • MySQL
  • NATS Streaming
  • PostgreSQL
  • Prometheus
  • RabbitMQ Queue
  • Redis Lists
  • Redis Streams
  • *HTTP Trigger(Prometheusを利用して1->nスケールに対応)
    たぶんAzure Functionsでやろうと思えばできるかも・・・

    様々なリソースが利用可能です。

    ここからはAzure Functionsをどうやって動かすかを説明します。

    Azure Functions Core Tools

    ローカル環境で動作するAzure Functionsを利用します。
    Docker でも動作します。

    Azure Functions on Kubernetes with KEDA

    デモ環境

    EKSからAzure Queue Storageからキューを取り込むだけの環境です。

    必要なもの

  • Azure CLI(ポータル使わないならいる)
  • Git
  • Kubectl
  • Docker
  • npm
  • AWS CLI
  • eksctl
  • 今回の検証ではVisual Studio Codespaces を利用しています。
    CodespaceにはAzure CLI、Docker、Git、npmはすでにインストール済みでした。

    Azure Functions Core Toolsのインストール

    Azure Queue Storageの作成

    事前にjs-queue-items という名前でQueueを作成します。

    設定

    local.settings.json

    接続文字列はStorageのアクセスキーを確認します。

    QueueTrigger/index.js

    EKS クラスター起動

    .kube/config も勝手に設定してくれます。

    EKSにKEDAをインストール

    KEDA

    Azure Function アプリをデプロイ

    動作確認

    1、Azure Queue Storageにキューを追加する。
    2、Podsを確認する。

    5分でターミネートされます。

    GKEでも確認済みです。
    Alibaba Cloudでも確認済みです。
    (中国リージョンはDockerHub を利用できないのでContainer Registryを利用しました。

    まとめ

    Azure FunctionsはAWSで動作します。
    クラウドプロバイダーでも動作します。
    GCP、Alibaba Cloudでも。
    Azure Functionsを別にしてもKEDAはニッチな所で登場するかもしれません。