VPC(仮想プライベートクラウド)経由で Tair (Redis OSS-compatible) インスタンスに接続する Function Compute 関数をデプロイします。本ガイドでは、Serverless Devs を使用して Python 3 の関数をデプロイし、Tair に格納されたカウンター値の読み取りと増分処理を行う手順を説明します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
Function Compute が有効化された Alibaba Cloud アカウント
Serverless Devs と Docker がインストールされ、AccessKey ペアの設定が完了していること
作成済みで実行中の Tair (Redis OSS-compatible) インスタンス
少なくとも 1 つの vSwitch および 1 つのセキュリティグループを含む VPC
Tair インスタンスと Function Compute 関数は、同じリージョン内にある必要があります。Tair インスタンスを、Function Compute がサポートするゾーンで作成します。インスタンスがサポートされていないゾーンにある場合は、同じ VPC 内のサポートされているゾーンに vSwitch を作成します。同じ VPC 内の vSwitch はプライベートネットワークを介して通信できるため、Function Compute は引き続きインスタンスにアクセスできます。詳細については、「「vSwitch がサポートされていないゾーンにあります」エラーを解決する方法は?」をご参照ください。
IP アドレスホワイトリストの設定
関数をデプロイする前に、Tair インスタンスのホワイトリストに vSwitch の CIDR ブロックを追加し、Function Compute がインスタンスにアクセスできるように設定します。
Function Compute による Tair インスタンスへのアクセスを許可するには、IP アドレスホワイトリストを使用してください。セキュリティグループモードは使用しないでください。セキュリティグループモードでは、一時的な接続障害が発生する可能性があります。
Tair コンソール にログインします。
上部ナビゲーションバーで、インスタンスがデプロイされているリージョンを選択します。
インスタンス ページで、対象のインスタンスを見つけ、その ID をクリックします。
左側ナビゲーションウィンドウで、ホワイトリスト設定 をクリックします。ホワイトリスト設定 タブで、変更するホワイトリストを見つけ、編集 をクリックします(操作 列)。
ホワイトリストの編集 パネルで、ホワイトリスト フィールドに vSwitch の CIDR ブロックを入力し、OK をクリックします。
操作手順
ステップ 1:プロジェクトの初期化
以下のコマンドを実行してプロジェクトを初期化します。
sudo s initCLI のプロンプトに従って操作します。
ベンダーとして Alibaba Cloud を選択します。
クイックスタート モードを選択します。
組み込みの Python ランタイムを選択します。
プロジェクト名およびリージョンを指定します。本ガイドでは、中国 (杭州) リージョンの
start-fc-redis-pythonプロジェクトを使用します。
プロジェクトディレクトリに移動します。
cd start-fc-redis-pythonステップ 2:プロジェクトファイルの構成
s.yaml の編集
以下の構成で s.yaml ファイルを編集します。プレースホルダーの値を、実際の VPC、セキュリティグループ、vSwitch、および Tair インスタンスの詳細情報に置き換えてください。
edition: 1.0.0
name: fcDeployApp
access: "default"
services:
fc-db-redis-python:
component: devsapp/fc
props:
region: cn-hangzhou
service:
name: fc-db-demo
description: 'fc visit db のデモ'
internetAccess: true
vpcConfig:
vpcId: vpc-bp1oeg1fwxzuxcliq**** # Tair インスタンスが存在する VPC の ID
securityGroupId: sg-bp164seaxj7wc4d0**** # セキュリティグループ ID
vswitchIds:
- vsw-bp1192npo1ziqzw4**** # vSwitch ID(Tair のホワイトリストにその CIDR ブロックを追加)
function:
name: redis
description: redis へのアクセス
runtime: python3
codeUri: ./code
handler: index.handler
memorySize: 256
timeout: 30
initializationTimeout: 60
initializer: index.initializer
environmentVariables:
REDIS_HOST: r-bp1h2g53l3thqg****.redis.rds.aliyuncs.com # Tair インスタンスの非公開エンドポイント
REDIS_PASSWORD: **** # Tair インスタンスのパスワード
REDIS_PORT: 63** # Tair インスタンスの非公開ポート以下のプレースホルダーを実際の値に置き換えてください。
| プレースホルダー | 説明 | 例 |
|---|---|---|
vpc-bp1oeg1fwxzuxcliq**** | Tair インスタンスが存在する VPC の ID | vpc-bp1oeg1fwxzuxcliq1234 |
sg-bp164seaxj7wc4d0**** | セキュリティグループ ID | sg-bp164seaxj7wc4d01234 |
vsw-bp1192npo1ziqzw4**** | vSwitch ID | vsw-bp1192npo1ziqzw41234 |
r-bp1h2g53l3thqg****.redis.rds.aliyuncs.com | Tair インスタンスの非公開エンドポイント | r-bp1h2g53l3thqg1234.redis.rds.aliyuncs.com |
****(REDIS_PASSWORD) | Tair インスタンスのパスワード | ご利用のパスワード |
63** | Tair インスタンスの非公開ポート | 6379 |
index.py コードファイルの編集
この関数は、Tair インスタンスから counter キーの値を読み取り、1 増分して再び書き戻し、前の値を返します。
# -*- coding: utf-8 -*-
import os
import redis
# グローバル接続プール。関数呼び出し間で再利用され、レイテンシーを低減
conn_pool = None
def initializer(context):
"""環境変数を使用して Redis 接続プールを初期化します。"""
global conn_pool
conn_pool = redis.ConnectionPool(
host=os.environ['REDIS_HOST'],
password=os.environ['REDIS_PASSWORD'],
port=os.environ['REDIS_PORT'],
db=1,
decode_responses=True
)
def handler(event, context):
"""Tair におけるカウンター値の読み取り、増分、ライトバックを実行します。"""
global conn_pool
r = redis.Redis(connection_pool=conn_pool)
counter = r.get('counter')
if counter is None:
counter = 0
else:
counter = int(counter)
print('counter: ' + str(counter))
r.set('counter', str(counter + 1))
return counterredis Python ライブラリはサードパーティ依存関係です。 次のステップで Docker を使用してプロジェクトをビルドすると、自動的にバンドルされます。 その他の依存関係管理オプションについては、「関数にサードパーティ依存関係をインストールする」をご参照ください。
ステップ 3:ビルドおよびデプロイ
プロジェクトをビルドします。
sudo s build --use-dockerプロジェクトをデプロイします。
sudo s deploy -yステップ 4:関数の呼び出しおよび検証
sudo s invoke -e "{}"期待される出力:
[2021-09-14T17:08:50.875] [INFO ] [S-CLI] - 開始 ...
========= FC 呼び出しログ開始 =========
FC 初期化開始 RequestId: ccd73383-048d-4c8d-834e-93da59b86a21
FC 初期化終了 RequestId: ccd73383-048d-4c8d-834e-93da59b86a21
FC 呼び出し開始 RequestId: eccafc0a-493e-4f3e-9afa-45c0b84a2c0f
counter: 0
FC 呼び出し終了 RequestId: eccafc0a-493e-4f3e-9afa-45c0b84a2c0f
実行時間: 27.51 ms、課金時間: 28 ms、メモリサイズ: 256 MB、最大メモリ使用量: 34.05 MB
========= FC 呼び出しログ終了 =========
FC 呼び出し結果:
0
メソッド invoke の終了返された値は 0 から始まり、呼び出しのたびに増分します。これは、関数が Tair インスタンス内の counter キーを正しく読み書きできていることを確認するものです。複数回呼び出しを実行して、カウンターが正しく増分することを検証してください:0、1、2… と続きます。
トラブルシューティング
接続タイムアウト
症状: 関数がタイムアウトし、結果を返さない。
原因および解決策:
VPC の構成ミス:
vpcId、securityGroupId、およびvswitchIdsがs.yamlで正しく設定されており、かつ Tair インスタンスと同じ VPC に属しているか確認してください。ホワイトリスト未設定:vSwitch の CIDR ブロックが Tair インスタンスのホワイトリストに追加されているか確認してください。「IP アドレスホワイトリストの設定」をご参照ください。
サポートされていないゾーンの vSwitch: Function Compute がサポートするゾーンに vSwitch を作成してください。詳細については、「vSwitch is in unsupported zone」エラーを解決する方法をご参照ください。
認証失敗
症状: 関数が NOAUTH Authentication required、ERR invalid password、または WRONGPASS invalid username-password pair エラーを返す。
原因および解決策:
パスワードが不正:
REDIS_PASSWORD環境変数がs.yamlで正しく設定されているか確認してください。ホストまたはポートが不正:
REDIS_HOSTおよびREDIS_PORTが、Tair コンソールに表示される非公開エンドポイントおよびポートと一致しているか確認してください。
依存関係エラー
症状: 関数が ModuleNotFoundError: No module named 'redis' エラーを返す。
解決策: デプロイ前に Docker を使用してプロジェクトをビルドしてください。
sudo s build --use-docker
sudo s deploy -y詳細については、「一般的なエラーとトラブルシューティング」と「データベースアクセス障害のトラブルシューティング方法」をご参照ください。
リソースのクリーンアップ
継続的な課金を回避するため、本ガイドで作成したリソースを削除してください。
デプロイ済みの関数およびサービスを削除します。
sudo s remove -yTair インスタンスが本チュートリアル専用に作成された場合は、Tair コンソール でリリースしてください。
VPC、vSwitch、またはセキュリティグループが本チュートリアル専用に作成された場合は、VPC コンソール で削除してください。
参考情報
ネットワーク設定の構成 — Function Compute の vSwitch の詳細および CIDR ブロックを表示