نقشه‌برداری بندر اتصال سرویس خصوصی برای تولیدکنندگان خدمات

۱. مقدمه

با Private Service Connect، تولیدکنندگان سرویس می‌توانند سرویس‌ها را در یک محیط VPC از طریق یک ضمیمه سرویس در معرض نمایش قرار دهند و به مصرف‌کنندگان در یک محیط VPC دیگر اجازه دهند تا از طریق یک نقطه پایانی Private Service Connect به آن سرویس‌ها دسترسی پیدا کنند. گاهی اوقات این سرویس‌های تولیدکننده به صورت خوشه‌ای از ماشین‌های مجازی طراحی می‌شوند که هر ماشین مجازی سرویس‌های یکسانی را روی شماره پورت‌های یکسان در معرض نمایش قرار می‌دهد. پیش از این، این طراحی‌های سرویس نیازمند استقرار چندین نقطه پایانی Private Service Connect در سمت مصرف‌کننده یا استفاده از IP Forwarding در سمت تولیدکننده برای اطمینان از هدف قرار گرفتن ماشین مجازی تولیدکننده صحیح بود.

سرویس خصوصی Connect اکنون می‌تواند با استفاده از Port Mapping، مقصد صحیح را به صورت بومی هدف قرار دهد. در این آزمایش، در مورد مواردی که این ویژگی مورد نیاز است و نحوه استقرار یک Port Mapping NEG در بار کاری سرویس خصوصی Connect، خواهید آموخت.

آنچه یاد خواهید گرفت

  • موارد استفاده از نگاشت پورت اتصال سرویس خصوصی
  • مزایای کلیدی نقشه‌برداری پورت PSC
  • الزامات شبکه
  • با استفاده از نگاشت پورت، یک سرویس تولیدکننده Private Service Connect ایجاد کنید.
  • ایجاد یک نقطه پایانی اتصال سرویس خصوصی
  • برقراری تماس از طریق یک نقطه پایانی Private Service Connect به یک سرویس تولیدکننده

آنچه نیاز دارید

  • پروژه گوگل کلود با مجوزهای مالک

۲. موارد استفاده از نگاشت پورت اتصال سرویس خصوصی

ویژگی Port Mapping از Port Mapping NEG (گروه نقطه پایانی شبکه) استفاده می‌کند که مخصوص موارد استفاده PSC است.

رایج‌ترین انواع تولیدکننده‌هایی که می‌توانند از استفاده از نگاشت پورت بهره‌مند شوند، تولیدکننده‌های پایگاه داده NoSQL و تولیدکننده‌های Kafka هستند. با این حال، هر تولیدکننده‌ای که به خوشه‌ای از ماشین‌های مجازی نیاز دارد که سرویس‌های یکسانی را روی پورت‌های یکسان با الزامات نگاشت ماشین مجازی خاص ارائه می‌دهند، می‌تواند از این ویژگی استفاده کند.

تولیدکننده، نگاشت بین یک پورت کلاینت و یک پورت ماشین مجازی تولیدکننده + پورت مقصد را تعریف می‌کند. سپس تولیدکننده باید این اطلاعات را با مصرف‌کننده به اشتراک بگذارد. مصرف‌کننده از پورت‌های از پیش تعریف‌شده برای شناسایی منحصر به فرد پورت ماشین مجازی تولیدکننده + پورت مقصدی که باید به آن دسترسی پیدا کند، استفاده می‌کند. پورتی که توسط مصرف‌کننده استفاده می‌شود، پورت متفاوتی است که توسط تولیدکننده استفاده می‌شود.

مزایای کلیدی نقشه‌برداری پورت PSC

  • ساده است: تولیدکنندگان اجزای PSC را با نگاشت پورت مستقر می‌کنند و مصرف‌کنندگان یک نقطه پایانی PSC را مستقر می‌کنند. PSC به طور خودکار ترجمه آدرس شبکه را انجام می‌دهد.
  • مقرون به صرفه: به منابع PSC اضافی یا چرخه‌های CPU ماشین مجازی تولیدکننده نیاز ندارد. قیمت‌گذاری آن مشابه سایر انواع استقرار PSC است.
  • عملکرد بالا: نگاشت پورت، همان نرخ انتقال خط و تأخیر کم را مانند سایر حالت‌های PSC ارائه می‌دهد.
  • مقیاس‌پذیر و کارآمد از نظر IP: یک آدرس IP از VPC مصرف‌کننده می‌تواند به حداکثر ۱۰۰۰ ماشین مجازی تولیدکننده و ۱۰۰۰ نگاشت پورت دسترسی داشته باشد.

۳. الزامات شبکه

  • نگاشت پورت نیازمند استفاده از یک متعادل‌کننده بار عبوری شبکه داخلی به عنوان متعادل‌کننده بار تولیدکننده است.
  • فقط نقاط پایانی PSC می‌توانند با Port Mapping استفاده شوند (نه PSC Backends یا PSC Interface).
  • نقشه‌برداری بنادر از NEGها، سازه‌های منطقه‌ای هستند.
  • نگاشت پورت NEGها فقط می‌توانند از طریق اتصال PSC استفاده شوند. اگر ماشین مجازی کلاینت، قانون ارسال متعادل‌کننده بار تولیدکننده را مستقیماً فراخوانی کند، آنها کار نخواهند کرد. این موضوع در نحوه آزمایش سرویس تولیدکننده در این آزمایشگاه کد منعکس شده است.
  • نقطه پایانی PSC و پشته سرویس تولیدکننده باید در VPC های مختلف باشند.

۴. توپولوژی Codelab

ad37cfc003475b7c.png

در VPC تولیدکننده، دو ماشین مجازی ایجاد خواهد شد که هر کدام دو وب سرور را اجرا می‌کنند، یکی روی پورت ۱۰۰۰ و دیگری روی پورت ۲۰۰۰. ما قبل از تنظیم Portmap NEG، Internal Network Passthrough Load Balancer و Service Attachment، هر سرویس را آزمایش خواهیم کرد.

در VPC مصرف‌کننده، یک نقطه پایانی PSC راه‌اندازی خواهیم کرد و اتصال به سرویس تولیدکننده را از یک ماشین مجازی کلاینت آزمایش خواهیم کرد.

۵. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • نام پروژه، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. شما همیشه می‌توانید آن را به‌روزرسانی کنید.
  • شناسه پروژه در تمام پروژه‌های گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چیست. در اکثر آزمایشگاه‌های کد، باید شناسه پروژه خود را (که معمولاً با عنوان PROJECT_ID شناخته می‌شود) ارجاع دهید. اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی می‌ماند.
  • برای اطلاع شما، یک مقدار سوم، شماره پروژه ، وجود دارد که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد هزینه زیادی نخواهد داشت، اگر اصلاً هزینه‌ای داشته باشد. برای خاموش کردن منابع به منظور جلوگیری از پرداخت صورتحساب پس از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

شروع پوسته ابری

اگرچه می‌توان از راه دور و از طریق لپ‌تاپ، گوگل کلود را مدیریت کرد، اما در این آزمایشگاه کد، از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهید کرد.

از کنسول گوگل کلود ، روی آیکون Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:

55efc1aaa7a4d3ad.png

آماده‌سازی و اتصال به محیط فقط چند لحظه طول می‌کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:

7ffe5cbb04455448.png

این ماشین مجازی با تمام ابزارهای توسعه‌ای که نیاز دارید، مجهز شده است. این ماشین مجازی یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و روی فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود می‌بخشد. تمام کارهای شما در این آزمایشگاه کد را می‌توان در یک مرورگر انجام داد. نیازی به نصب چیزی ندارید.

۶. قبل از شروع

فعال کردن APIها

داخل Cloud Shell، مطمئن شوید که شناسه پروژه شما تنظیم شده است

gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]
project=[YOUR-PROJECT-ID]
region=us-central1
zone=us-central1-a
echo $project
echo $region
echo $zone

فعال کردن تمام سرویس‌های لازم

gcloud services enable compute.googleapis.com

۷. ایجاد شبکه VPC تولیدکننده

شبکه VPC

از پوسته ابری

gcloud compute networks create producer-vpc --subnet-mode custom

ایجاد زیرشبکه‌ها

از پوسته ابری

gcloud compute networks subnets create producer-service-subnet --network producer-vpc --range 10.0.0.0/24 --region $region --enable-private-ip-google-access

gcloud compute networks subnets create psc-nat-subnet --network producer-vpc --range 10.100.100.0/24 --region $region --purpose=PRIVATE_SERVICE_CONNECT

زیرشبکه PSC به منظور ترجمه آدرس شبکه با ضمیمه سرویس PSC مرتبط خواهد شد. برای موارد استفاده در محیط عملیاتی، این زیرشبکه باید به طور مناسب اندازه‌گذاری شود تا از میزان ترافیک ورودی از تمام نقاط پایانی PSC متصل پشتیبانی کند. برای اطلاعات بیشتر به مستندات تعیین اندازه زیرشبکه PSC NAT مراجعه کنید.

ایجاد سیاست و قوانین فایروال شبکه

از پوسته ابری

gcloud compute network-firewall-policies create producer-vpc-policy --global

gcloud compute network-firewall-policies associations create --firewall-policy producer-vpc-policy --network producer-vpc --name network-producer-vpc --global-firewall-policy

برای اینکه به IAP اجازه دهید به ماشین‌های مجازی شما متصل شود، یک قانون فایروال ایجاد کنید که:

  • برای تمام نمونه‌های ماشین مجازی که می‌خواهید با استفاده از IAP به آنها دسترسی داشته باشید، اعمال می‌شود.
  • اجازه ورود ترافیک از محدوده IP 35.235.240.0/20 را می‌دهد. این محدوده شامل تمام آدرس‌های IP است که IAP برای ارسال TCP استفاده می‌کند.

از پوسته ابری

gcloud compute network-firewall-policies rules create 1000 --action ALLOW --firewall-policy producer-vpc-policy --description "SSH with IAP" --direction INGRESS --src-ip-ranges 35.235.240.0/20 --layer4-configs tcp:22  --global-firewall-policy

قانون فایروال زیر، ترافیک روی پورت‌های TCP 1000-2000 را از زیرشبکه PSC به تمام نمونه‌های موجود در شبکه مجاز می‌کند. در یک محیط عملیاتی، این قانون فایروال باید فقط به نمونه‌های مرتبط با سرویس تولیدکننده خاص محدود شود.

از پوسته ابری

gcloud compute network-firewall-policies rules create 2000 --action ALLOW --firewall-policy producer-vpc-policy --description "allow traffic from PSC NAT subnet" --direction INGRESS --src-ip-ranges 10.100.100.0/24 --layer4-configs tcp:1000-2000 --global-firewall-policy

قانون فایروال زیر به تمام ترافیک درون زیرشبکه سرویس‌ها روی پورت‌های TCP 1000-2000 اجازه عبور می‌دهد. این قانون برای آزمایش عملکرد صحیح سرویس تولیدکننده ما استفاده خواهد شد.

از پوسته ابری

gcloud compute network-firewall-policies rules create 2001 --action ALLOW --firewall-policy producer-vpc-policy --description "allow traffic within the service subnet" --direction INGRESS --src-ip-ranges 10.0.0.0/24 --layer4-configs tcp:1000-2000 --global-firewall-policy

ایجاد و پیکربندی ماشین‌های مجازی تولیدکننده

ایجاد ماشین‌های مجازی

از پوسته ابری

gcloud compute instances create portmap-vm1 --zone=$zone --subnet=producer-service-subnet --no-address

gcloud compute instances create portmap-vm2 --zone=$zone --subnet=producer-service-subnet --no-address

gcloud compute instances create test-client-vm --zone=$zone --subnet=producer-service-subnet --no-address

در بخش بعدی، سرور http را روی پورت‌های ۱۰۰۰ و ۲۰۰۰ روی هر ماشین مجازی تولیدکننده راه‌اندازی کنید.

پیکربندی ماشین‌های مجازی

از پوسته ابری

gcloud compute ssh --zone $zone "portmap-vm1" --tunnel-through-iap --project $project

در Cloud Shell از جلسه portmap-vm1

mkdir 1000
cd 1000
echo "portmap-vm1 1000">index.html
sudo python3 -m http.server 1000 &
cd ..
mkdir 2000
cd 2000
echo "portmap-vm1 2000">index.html
sudo python3 -m http.server 2000 &

یک پنجره Cloud Shell جدید باز کنید

با تنظیم مجدد متغیرها شروع کنید. در Cloud Shell

project=[YOUR-PROJECT-ID]
region=us-central1
zone=us-central1-a
echo $project
echo $region
echo $zone

gcloud compute ssh --zone $zone "portmap-vm2" --tunnel-through-iap --project $project

در Cloud Shell از جلسه portmap-vm2

mkdir 1000
cd 1000
echo "portmap-vm2 1000">index.html
sudo python3 -m http.server 1000 &
cd ..
mkdir 2000
cd 2000
echo "portmap-vm2 2000">index.html
sudo python3 -m http.server 2000 &

۸. خدمات تولیدکننده تست

ابتدا، باید آدرس‌های IP نمونه‌های portmap را بدست آوریم. به هر دوی این آدرس‌های IP توجه کنید.

یک پنجره Cloud Shell جدید باز کنید

با تنظیم مجدد متغیرها شروع کنید. در Cloud Shell

project=[YOUR-PROJECT-ID]
region=us-central1
zone=us-central1-a
echo $project
echo $region
echo $zone

gcloud compute instances describe portmap-vm1 \
  --format='get(networkInterfaces[0].networkIP)' --zone $zone

gcloud compute instances describe portmap-vm2\
  --format='get(networkInterfaces[0].networkIP)' --zone $zone

وارد نمونه آزمایشی شوید. در Cloud Shell

gcloud compute ssh --zone $zone "test-client-vm" --tunnel-through-iap --project $project

curl [portmap-vm1 IP]:1000

خروجی مورد انتظار

portmap-vm1 1000

در پوسته ابری

curl [portmap-vm1 IP]:2000

خروجی مورد انتظار

portmap-vm1 2000

در پوسته ابری

curl [portmap-vm2 IP]:1000

خروجی مورد انتظار

portmap-vm2 1000

در پوسته ابری

curl [portmap-vm2 IP]:2000

خروجی مورد انتظار

portmap-vm2 2000

خروج از test-client-vm

۹. ایجاد سرویس تولیدکننده با Portmap NEG

ایجاد اجزای متعادل‌کننده بار

از پوسته ابری

gcloud compute network-endpoint-groups create portmap-neg --region=$region --network=producer-vpc --subnet=producer-service-subnet --network-endpoint-type=GCE_VM_IP_PORTMAP

نقاط پایانی را به Portmap NEG اضافه کنید تا نگاشتی از پورت کلاینت به پورت تولیدکننده ایجاد شود. تولیدکننده این نگاشت را ایجاد می‌کند و روش خاص خود را برای انتقال این اطلاعات به مصرف‌کنندگان خواهد داشت. نگاشت پورت خاص از طریق PSC به اشتراک گذاشته نمی‌شود.

در پوسته ابری

gcloud compute network-endpoint-groups update portmap-neg --region=$region --add-endpoint=client-destination-port=1001,instance=projects/$project/zones/$zone/instances/portmap-vm1,port=1000 --add-endpoint=client-destination-port=1002,instance=projects/$project/zones/$zone/instances/portmap-vm1,port=2000 --add-endpoint=client-destination-port=1003,instance=projects/$project/zones/$zone/instances/portmap-vm2,port=1000 --add-endpoint=client-destination-port=1004,instance=projects/$project/zones/$zone/instances/portmap-vm2,port=2000

ساخت متعادل‌کننده بار را کامل کنید.

در پوسته ابری

gcloud compute backend-services create portmap-bes --load-balancing-scheme=internal --region=$region --network=producer-vpc

gcloud compute backend-services add-backend portmap-bes --network-endpoint-group=portmap-neg --network-endpoint-group-region=$region

gcloud compute forwarding-rules create portmap-fr --load-balancing-scheme=INTERNAL --network=producer-vpc --subnet=producer-service-subnet --ports=ALL --region=$region --backend-service=portmap-bes

ایجاد پیوست سرویس

از پوسته ابری

gcloud compute service-attachments create portmap-service-attachment --region=$region --producer-forwarding-rule=portmap-fr --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=psc-nat-subnet

در مرحله بعد، URI پیوست سرویس را بازیابی و یادداشت کنید تا نقطه پایانی PSC را در محیط مصرف‌کننده پیکربندی کنید.

در پوسته ابری

gcloud compute service-attachments describe portmap-service-attachment --region=$region

مثال خروجی مورد انتظار

connectionPreference: ACCEPT_AUTOMATIC
creationTimestamp: '2024-07-19T10:02:29.432-07:00'
description: ''
enableProxyProtocol: false
fingerprint: LI8D6JNQsLA=
id: '6207474793859982026'
kind: compute#serviceAttachment
name: portmap-service-attachment
natSubnets:
- https://www.googleapis.com/compute/v1/projects/$project/regions/$zone/subnetworks/psc-nat-subnet
pscServiceAttachmentId:
  high: '94288091358954472'
  low: '6207474793859982026'
reconcileConnections: false
region: https://www.googleapis.com/compute/v1/projects/$project/regions/$region
selfLink: https://www.googleapis.com/compute/v1/projects/$project/regions/$region/serviceAttachments/portmap-service-attachment
targetService: https://www.googleapis.com/compute/v1/projects/$project/regions/$region/forwardingRules/portmap-fr

۱۰. ایجاد شبکه VPC مصرف‌کننده

شبکه VPC

از پوسته ابری

gcloud compute networks create consumer-vpc --subnet-mode custom

ایجاد زیرشبکه

از پوسته ابری

gcloud compute networks subnets create consumer-client-subnet --network consumer-vpc --range=10.0.0.0/24 --region $region --enable-private-ip-google-access

ایجاد سیاست و قوانین فایروال شبکه

از پوسته ابری

gcloud compute network-firewall-policies create consumer-vpc-policy --global

gcloud compute network-firewall-policies associations create --firewall-policy consumer-vpc-policy --network consumer-vpc --name network-consumer-vpc --global-firewall-policy

gcloud compute network-firewall-policies rules create 1000 --action ALLOW --firewall-policy consumer-vpc-policy --description "SSH with IAP" --direction INGRESS --src-ip-ranges 35.235.240.0/20 --layer4-configs tcp:22  --global-firewall-policy

فقط دسترسی SSH از IAP برای شبکه مصرف‌کننده مورد نیاز است.

۱۱. ایجاد ماشین مجازی، نقطه پایانی PSC و تست اتصال

در این مرحله، باید سه پنجره Cloud Shell باز باشد. یکی باید یک جلسه باز با portmap-vm1 داشته باشد. یکی باید یک جلسه باز با portmap-vm2 داشته باشد و دیگری باید جلسه کاری باشد.

ایجاد ماشین مجازی آزمایشی

از پوسته ابری

gcloud compute instances create consumer-client-vm --zone $zone --subnet=consumer-client-subnet --no-address

ایجاد نقطه پایانی PSC

از پوسته ابری

gcloud compute addresses create psc-endpoint-ip --region=$region --subnet=consumer-client-subnet --addresses 10.0.0.10

gcloud compute forwarding-rules create psc-portmap-endpoint --region=$region --network=consumer-vpc --address=psc-endpoint-ip --target-service-attachment=[SERVICE ATTACHMENT URI]

اتصال را آزمایش کنید

از پوسته ابری

gcloud compute ssh --zone $zone "consumer-client-vm" --tunnel-through-iap --project $project

curl 10.0.0.10:1001

خروجی مورد انتظار

portmap-vm1 1000

از پوسته ابری

curl 10.0.0.10:1002

خروجی مورد انتظار

portmap-vm1 2000

از پوسته ابری

curl 10.0.0.10:1003

خروجی مورد انتظار

portmap-vm2 1000

از پوسته ابری

curl 10.0.0.10:1004

خروجی مورد انتظار

portmap-vm2 2000

۱۲. مراحل پاکسازی

خروج از نمونه ماشین مجازی (تمام پنجره‌ها)

exit

از یک ترمینال Cloud Shell، اجزای آزمایشگاه را حذف کنید

gcloud compute forwarding-rules delete psc-portmap-endpoint --region=$region -q

gcloud compute addresses delete psc-endpoint-ip --region=$region -q

gcloud compute instances delete consumer-client-vm --zone=$zone -q

gcloud compute network-firewall-policies rules delete 1000 --firewall-policy=consumer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies associations delete --firewall-policy=consumer-vpc-policy  --name=network-consumer-vpc --global-firewall-policy -q

gcloud compute network-firewall-policies delete consumer-vpc-policy --global -q

gcloud compute networks subnets delete consumer-client-subnet  --region=$region -q

gcloud compute networks delete consumer-vpc -q

gcloud compute service-attachments delete portmap-service-attachment --region=$region -q

gcloud compute forwarding-rules delete portmap-fr --region=$region -q

gcloud compute backend-services delete portmap-bes --region=$region -q

gcloud compute network-endpoint-groups delete portmap-neg --region=$region -q

gcloud compute instances delete test-client-vm --zone=$zone -q

gcloud compute instances delete portmap-vm2 --zone=$zone -q

gcloud compute instances delete portmap-vm1 --zone=$zone -q

gcloud compute network-firewall-policies rules delete 2001 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies rules delete 2000 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies rules delete 1000 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies associations delete --firewall-policy=producer-vpc-policy  --name=network-producer-vpc --global-firewall-policy -q

gcloud compute network-firewall-policies delete producer-vpc-policy --global -q

gcloud compute networks subnets delete psc-nat-subnet --region $region -q

gcloud compute networks subnets delete producer-service-subnet --region $region -q

gcloud compute networks delete producer-vpc -q

۱۳. تبریک می‌گویم!

تبریک می‌گویم که آزمایشگاه کد را تمام کردی.

آنچه ما پوشش داده‌ایم

  • موارد استفاده از نگاشت پورت اتصال سرویس خصوصی
  • مزایای کلیدی نقشه‌برداری پورت PSC
  • الزامات شبکه
  • با استفاده از نگاشت پورت، یک سرویس تولیدکننده Private Service Connect ایجاد کنید.
  • ایجاد یک نقطه پایانی اتصال سرویس خصوصی
  • برقراری تماس از طریق یک نقطه پایانی Private Service Connect به یک سرویس تولیدکننده