পাঠ ১৯ · ৫৭-এর মধ্যে · মডিউল ৫
Home / Courses / Cloud Computing & DevOps / Terraform মডিউল ও রিইউজেবিলিটি

Terraform মডিউল ও রিইউজেবিলিটি

Terraform modules & reusability
৮ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • Terraform মডিউল কী এবং কেন এটি প্রোগ্রামিং-এর ফাংশনের সাথে তুলনীয়
  • মডিউল ব্যবহার না করলে কী সমস্যা হয় — কপি-পেস্ট করা রিসোর্স ব্লকের বিপদ
  • একই মডিউল ভিন্ন প্যারামিটার দিয়ে dev ও production-এর জন্য ব্যবহার করার প্যাটার্ন
  • Python দিয়ে একটি প্যারামিটারাইজড "web server module" ফাংশন লেখা

১ · সমস্যা — কপি-পেস্ট করা রিসোর্স ব্লক

L18-এ আমরা দেখেছি একটি resource ব্লক কীভাবে একটি একক ইনফ্রাস্ট্রাকচার অবজেক্ট বর্ণনা করে। কিন্তু বাস্তব অ্যাপ্লিকেশনে একটি "স্ট্যান্ডার্ড ওয়েব সার্ভার সেটআপ"-এ সাধারণত একাধিক resource একসাথে লাগে — একটি VM, একটি সংযুক্ত সিকিউরিটি গ্রুপ, হয়তো একটি স্টোরেজ ভলিউম। যদি আপনাকে dev, staging ও production — তিনটি এনভায়রনমেন্টের জন্য এই একই সেটআপ বারবার কপি-পেস্ট করতে হয়, তাহলে —

  • একটি এনভায়রনমেন্টে বাগ ফিক্স করলে বাকিগুলোতে ম্যানুয়ালি আবার সেই একই ফিক্স করতে ভুলে যাওয়ার ঝুঁকি থাকে।
  • সময়ের সাথে এনভায়রনমেন্টগুলো ধীরে ধীরে একে অপর থেকে সূক্ষ্মভাবে ভিন্ন হয়ে যায় (একটি "কনফিগারেশন ড্রিফট"-এর মতো সমস্যা, L20-তে বিস্তারিত)।
  • নতুন টিম মেম্বারকে প্রতিটি নিচু-স্তরের resource ব্লক বুঝতে হয়, শুধু "একটি স্ট্যান্ডার্ড ওয়েব সার্ভার লাগবে" জানলেই যথেষ্ট হয় না।

২ · Module — প্রোগ্রামিং-এর ফাংশনের মতো একটি বান্ডল

ModuleTerraform Moduleএকটি reusable, প্যারামিটারাইজড বান্ডল অফ resource ডেফিনিশন — প্রোগ্রামিং-এর ফাংশনের মতো, যা প্যারামিটার নেয় এবং প্রতিবার একই ধারাবাহিক কাঠামো তৈরি করে। এই সমস্যার সমাধান দেয় — একটি ফাংশনের মতো, একটি মডিউল কিছু প্যারামিটার (যেমন instance size, region) নেয় এবং ভিতরে ধারাবাহিকভাবে একাধিক resource তৈরি করে। মডিউলটি একবার লেখা হয়, তারপর dev/staging/production-এর জন্য শুধু ভিন্ন প্যারামিটার দিয়ে বারবার কল করা হয় — ঠিক যেমন একটি Python ফাংশন ভিন্ন আর্গুমেন্ট দিয়ে বারবার কল করা হয়।

সামঞ্জস্য
প্রতিটি এনভায়রনমেন্ট একই মডিউল থেকে তৈরি, তাই কাঠামোগতভাবে একই — শুধু সাইজ/রিজিওন ভিন্ন।
একক ফিক্স-পয়েন্ট
মডিউলে একটি বাগ ফিক্স করলে, যে সব এনভায়রনমেন্ট সেই মডিউল ব্যবহার করে সবগুলোতেই প্রতিফলিত হয়।
সহজ অনবোর্ডিং
নতুন টিম মেম্বারকে শুধু মডিউলের ইনপুট/আউটপুট জানলেই চলে, প্রতিটি নিচু-স্তরের resource বুঝতে হয় না।

৩ · Python-এ একটি প্যারামিটারাইজড মডিউল সিমুলেট করা

নিচে web_server_module() একটি Python ফাংশন যা name, instance_size ও region প্যারামিটার নেয় এবং একটি dict ফেরত দেয় যাতে তিনটি "resource" বান্ডল করা আছে — instance config, security group config, ও storage config — ধারাবাহিকভাবে একই কাঠামোয়। একই ফাংশন dev ও production-এর জন্য ভিন্ন প্যারামিটার দিয়ে কল করা হয়েছে।

Python
# toy সিমুলেশন — কোনো real Terraform module বা cloud API কল হচ্ছে না
def web_server_module(name, instance_size, region):
    """একটি 'স্ট্যান্ডার্ড ওয়েব সার্ভার' মডিউল — instance + security group + storage বান্ডল করে।"""
    return {
        "instance": {
            "resource_name": f"{name}-instance",
            "size": instance_size,
            "region": region,
        },
        "security_group": {
            "resource_name": f"{name}-sg",
            "allowed_ports": [80, 443],
            "region": region,
        },
        "storage": {
            "resource_name": f"{name}-disk",
            "size_gb": 20 if instance_size == "small" else 100,
            "region": region,
        },
    }

def print_bundle(env_name, bundle):
    print(f"--- {env_name} এনভায়রনমেন্ট ---")
    for resource_type, spec in bundle.items():
        print(f"  {resource_type}: {spec}")

# একই মডিউল, ভিন্ন প্যারামিটার — dev বনাম production
dev_bundle = web_server_module(name="dev-web", instance_size="small", region="dhaka-1")
prod_bundle = web_server_module(name="prod-web", instance_size="large", region="dhaka-1")

print_bundle("dev", dev_bundle)
print()
print_bundle("production", prod_bundle)

print("\nদুটো বান্ডলেই একই ৩টি resource-type আছে (instance, security_group, storage) —")
print("শুধু প্যারামিটারের মান ভিন্ন, কাঠামো অভিন্ন।")

    
লক্ষ্য করুন — dev ও production দুটোই একই তিনটি resource-type ধারণ করে (instance, security_group, storage) এবং security_group-এ একই allowed_ports নীতি প্রয়োগ হয়েছে দুটোতেই। শুধু size ও storage size_gb ভিন্ন — এটিই মডিউলের মূল মূল্য: কাঠামোগত সামঞ্জস্য বজায় রেখে শুধু স্কেল ভিন্ন করা।

৪ · মডিউল রিপোজিটরি ও শেয়ারিং

বাস্তব Terraform ব্যবহারে টিমগুলো প্রায়ই তাদের নিজস্ব "স্ট্যান্ডার্ড" মডিউলের একটি অভ্যন্তরীণ লাইব্রেরি তৈরি করে (বা পাবলিক মডিউল রেজিস্ট্রি থেকে ভালো-পরীক্ষিত মডিউল ব্যবহার করে) — অনেকটা L26-এর কন্টেইনার রেজিস্ট্রির মতোই, যেখানে ভালো-পরীক্ষিত ইমেজ শেয়ার করা হয় বারবার একই জিনিস তৈরি করার বদলে। এই কোর্সে আমরা মডিউল রেজিস্ট্রি বা real Terraform সিনট্যাক্স নিয়ে কাজ করছি না — শুধু ধারণাটি (প্যারামিটারাইজড, reusable বান্ডল) toy Python ফাংশন দিয়ে শিখছি।

মূল কথা · Key takeaway

একটি মডিউল হলো ইনফ্রাস্ট্রাকচার কোডের জন্য একটি ফাংশন — প্যারামিটার নেয়, ধারাবাহিকভাবে একই কাঠামোর একাধিক resource তৈরি করে। এটি dev/staging/production জুড়ে সামঞ্জস্য নিশ্চিত করে এবং বাগ ফিক্স/উন্নতি একটি মাত্র জায়গায় করার সুযোগ দেয়। পরের পাঠে আমরা দেখব কীভাবে ইডেম্পোটেন্সি ও কনফিগারেশন ড্রিফট এই পুরো সিস্টেমের নির্ভরযোগ্যতার সাথে সরাসরি সম্পর্কিত।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ একটি টিম যদি মডিউল ব্যবহার না করে প্রতিটি এনভায়রনমেন্টের জন্য resource ব্লক আলাদাভাবে কপি-পেস্ট করে লেখে, তাহলে ৬ মাস পর কী সমস্যা দেখা দিতে পারে?

প্রতিটি কপি স্বাধীনভাবে পরিবর্তিত হতে থাকে — কেউ dev-এ একটি সিকিউরিটি রুল যোগ করে কিন্তু production-এ করতে ভুলে যায়, বা কেউ একটি টাইপো ফিক্স করে শুধু একটি ফাইলে। ফলে dev, staging ও production ধীরে ধীরে সূক্ষ্মভাবে ভিন্ন হয়ে যায়, এবং "dev-এ কাজ করছে কিন্তু production-এ করছে না" জাতীয় সমস্যা খুঁজে বের করা কঠিন হয়ে যায় — কারণ কেউ ঠিক জানে না ঠিক কী পার্থক্য জমা হয়েছে।

প্র ০২ মডিউলের প্যারামিটার সংখ্যা যদি খুব বেশি বেড়ে যায় (যেমন ২০+ প্যারামিটার), এটি কী নতুন সমস্যা তৈরি করতে পারে?

মডিউলটি ব্যবহার করা কঠিন হয়ে যায় — ব্যবহারকারীকে ২০টি প্যারামিটারের প্রতিটির সঠিক মান বুঝতে হয়, যা মডিউলের মূল উদ্দেশ্য (সরলীকরণ) নষ্ট করে দেয়। বাস্তবে এটি একটি সংকেত যে মডিউলটি হয়তো একাধিক ছোট, বেশি ফোকাসড মডিউলে ভাগ করা উচিত (ঠিক যেমন প্রোগ্রামিং-এ একটি ফাংশন যদি ২০টি প্যারামিটার নেয়, সেটি সাধারণত একাধিক ছোট ফাংশনে ভাঙার সংকেত)।

প্র ০৩ উপরের কোড সেলে storage.size_gb নির্ধারণে একটি if/else ব্যবহার করা হয়েছে (small হলে ২০, নাহলে ১০০) — বাস্তব মডিউলে এই hardcoded লজিক কেন ঝুঁকিপূর্ণ হতে পারে?

যদি ভবিষ্যতে একটি তৃতীয় instance_size (যেমন "medium") যোগ করা হয়, এই if/else লজিক ভুল আচরণ করবে (হয়তো "medium"-কেও ভুলভাবে ১০০ GB দিয়ে দেবে, কারণ এটি "small" নয়)। একটি আরও রোবাস্ট মডিউল ডিজাইন প্রতিটি instance_size-এর জন্য storage size একটি এক্সপ্লিসিট lookup dict-এ রাখতো, যাতে নতুন সাইজ যোগ করলে স্পষ্টভাবে একটি এন্ট্রি যোগ করতে হয় — নীরবে ভুল ডিফল্টে পড়ার বদলে।

অনুশীলন

  1. চিন্তা করুন: আপনার পরিচিত কোনো প্রোগ্রামিং প্রজেক্টে এমন কোনো কোড ব্লক ছিল কি যা একাধিক জায়গায় কপি-পেস্ট করা হয়েছিল? সেটিকে একটি ফাংশন/মডিউলে রূপান্তর করলে কী সুবিধা হতো?

    সাধারণ উদাহরণ: একই ভ্যালিডেশন লজিক একাধিক ফর্মে কপি-পেস্ট করা — একটি বাগ ফিক্স করলে বাকি জায়গায় আবার করতে ভুলে যাওয়ার ঝুঁকি থাকে। একটি সাধারণ validate_input() ফাংশনে রূপান্তর করলে (ঠিক এই পাঠের web_server_module()-এর মতো) একটি ফিক্স সব জায়গায় স্বয়ংক্রিয়ভাবে প্রতিফলিত হয়।

  2. পরীক্ষা করুন: উপরের কোড সেলে একটি তৃতীয় staging_bundle = web_server_module(name="staging-web", instance_size="small", region="chittagong-1") কল যোগ করুন এবং তিনটি বান্ডল একসাথে প্রিন্ট করুন।

    staging_bundle-এর কাঠামো dev ও production-এর মতোই তিনটি resource-type ধারণ করবে (instance, security_group, storage), কিন্তু region ভিন্ন ("chittagong-1") হওয়ায় প্রতিটি resource-এর region ফিল্ড সেই অনুযায়ী পরিবর্তিত হবে — এটি দেখায় একটি প্যারামিটার পরিবর্তন করলে কীভাবে পুরো বান্ডল জুড়ে ধারাবাহিকভাবে সেই পরিবর্তন প্রতিফলিত হয়।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
Terraform বেসিকস — প্রোভাইডার, রিসোর্স, স্টেট