1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

KubernetesでLambda!? ~ Python/Goで書ける Knative Function 実践(Gmail通知で学ぶイベント駆動)

Last updated at Posted at 2026-01-22

はじめに

こんにちは。
クラウドネイティブ/Kubernetes を中心に、Knative・Eventing・運用自動化などを触っているエンジニアです。

執筆した記事


この記事で分かること

  • Kubernetes上で FaaS(関数)っぽい体験を作る方法
  • Knative Functions で “常駐Podを立てない通知処理” を実装する手順
  • なぜこのアプローチが Kubernetesの敷居を下げ、今後注目されそうか(理由つき)

結論(先にまとめ)

  • Knative Functions は Kubernetes上で関数を書くためのシンプルなモデルを提供する(深いK8s知識を要求しない) :contentReference[oaicite:0]{index=0}
  • HTTP / イベントで起動し、需要がない時は scale-to-zero で0台まで落ちる(=常駐不要) :contentReference[oaicite:1]{index=1}
  • func deployOCIイメージを作ってレジストリへPushし、Knative Serviceとしてデプロイしてくれる :contentReference[oaicite:2]{index=2}
  • つまり「Kubernetesを、Python/Goから “Lambdaのように” 使う」入口として強い

なぜ今 Knative Functions なのか(メリットを重点的に)

ここが本題です。

1) ソフトウェアエンジニアの“Kubernetes学習コスト”を下げられる

Knative Functions は Knative / Kubernetes / コンテナ / Dockerfile の深い知識がなくても使える「シンプルなプログラミングモデル」を提供します :contentReference[oaicite:3]{index=3}
これが何を意味するかというと、

  • Platform/SRE:基盤(Knative Servingなど)を整備する
  • アプリ開発者:関数(=ビジネスロジック)に集中する

という分業がしやすくなります。
結果として「Kubernetes上で動くのに、開発体験がFaaS寄り」になり、Kubernetesの敷居が下がるのが大きいです。

2) “常駐Pod”を減らして、運用を軽くできる

通知・Webhook・小さな自動化のために、常駐Podを立て続けると、
監視・アップデート・リソース確保が積み上がります。

Knative Servingは、トラフィックが無い時に0台まで落とす scale-to-zero を提供します :contentReference[oaicite:4]{index=4}
→ 「使われない時は止まる」ので、運用負債を減らしやすいです。

3) ベンダーフリーで “Lambda的パターン” を持ち込める

Lambdaは便利ですが、設計や運用がAWS流になりやすいのも事実。
KnativeはKubernetes上なので、オンプレ / 複数クラウドでも成立しやすいのが強みです。

4) 今後注目されそうな理由(根拠つき)

  • Knativeは 2025年10月8日にCNCF Graduated(成熟度の強いシグナル) :contentReference[oaicite:5]{index=5}
  • CNCFの年次調査でも、クラウドネイティブ採用が成長し、回答者の一部では「開発/デプロイのほぼ全てがクラウドネイティブ」という状況が報告されています :contentReference[oaicite:6]{index=6}

「Kubernetesが共通基盤になっていくほど、その上での“開発者体験(FaaS)”の需要も上がる」
→ ここにKnativeが刺さる、という見立てです。


AWS Lambda と Knative Functions の違い(超ざっくり)

観点 AWS Lambda Knative Functions
実行基盤 AWS Kubernetes
ベンダー AWS依存 ベンダーフリー
実体 マネージド実行環境 コンテナ(Knative Service) :contentReference[oaicite:7]{index=7}
オンプレ 不可 可能
体験 関数中心 関数中心(K8s隠蔽しやすい) :contentReference[oaicite:8]{index=8}

今回作るもの(最小構成)

手順等は公式サイトを参照して作成しましたが、改訂等により一部修正が必要になっているところもあるかもしれないです

HTTPアクセス(curl / Webhook)
→ Knative Function(Go)
→ Gmail(SMTP) でメール通知

  • アクセスが来たら起動
  • 処理が終わればスケールダウン(設定により0台へ)
  • 認証情報はKubernetes Secretで管理

使用環境

  • OS: Ubuntu 22.04
  • 環境: AWS VM / オンプレミス
  • Kubernetes(Knative Serving 導入済)
  • Docker Hub アカウント
  • Gmail アカウント(アプリパスワード使用)

ステップ1: Gmail アプリパスワードの発行

  1. Google アカウントで 2段階認証を有効化
  2. アプリパスワード発行ページにアクセス
  3. 「メール」+ 任意のデバイス名で発行
  4. 16桁のパスワードを控える

ステップ2: 関数(handle.go)を実装

package function

import (
  "fmt"
  "io"
  "net/http"
  "net/smtp"
  "os"
)

func Handle(w http.ResponseWriter, r *http.Request) {
  body, _ := io.ReadAll(r.Body)
  fmt.Println("📨 イベント受信:", string(body))

  from := os.Getenv("MAIL_FROM")
  pass := os.Getenv("MAIL_PASS")
  to := os.Getenv("MAIL_TO")

  msg := "From: " + from + "\n" +
    "To: " + to + "\n" +
    "Subject: 📨 Knative Functionから通知\n\n" +
    "イベントが届きました: " + string(body)

  err := smtp.SendMail(
    "smtp.gmail.com:587",
    smtp.PlainAuth("", from, pass, "smtp.gmail.com"),
    from,
    []string{to},
    []byte(msg),
  )

  if err != nil {
    fmt.Println("メール送信失敗:", err)
  } else {
    fmt.Println("✅ メール送信成功")
  }

  fmt.Fprintln(w, "📧 メール送信処理完了")
}

ステップ3: Gmail 認証情報を Secret 化

mail-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mail-secret
  namespace: skupper
type: Opaque
stringData:
  MAIL_FROM: "your@gmail.com"
  MAIL_PASS: "your_app_password"
  MAIL_TO:   "recipient@example.com"

ステップ4: func.yaml に環境変数を設定

envVars:
- name: MAIL_FROM
  valueFrom:
    secretKeyRef:
      name: mail-secret
      key: MAIL_FROM
- name: MAIL_PASS
  valueFrom:
    secretKeyRef:
      name: mail-secret
      key: MAIL_PASS
- name: MAIL_TO
  valueFrom:
    secretKeyRef:
      name: mail-secret
      key: MAIL_TO

ステップ5: ビルド & デプロイ

func deploy --registry docker.io/あなたのユーザ名

デプロイ後、以下の URL が発行されます。

http://myfunc.<namespace>.<your-domain>.sslip.io

ステップ6: 動作確認

curl -X POST "http://myfunc.skupper.1.2.3.4.sslip.io" \
  -H "Content-Type: application/json" \
  -d '{"message":"手動メール送信"}'
  
### ログ確認:

kubectl logs -n skupper \
  -l serving.knative.dev/service=myfunc \
  -c user-container -f

まとめ(メリット)

Knative Functions を使うと、

  • 関数として書く(=ビジネスロジックに集中)
  • HTTP / イベントで起動
  • 常駐Podを減らせる(scale-to-zero)
  • しかも Kubernetes上(ベンダーフリー)

という 「Lambdaっぽい体験」 を作れます。
特に、通知・Webhook・運用自動化など “常駐させたくない小さな処理” に刺さります。


今後さらに注目されそうな理由(個人の見立て)

そして個人的には、Knativeは

  • CNCF Graduated(2025/10/8)
  • クラウドネイティブ採用が伸び続けている

という流れもあり、**「Kubernetesの敷居を下げるFaaSの入口」**として、今後さらに注目されるのでは?と考えています。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?