কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (সিইএল) একটি সাধারণ-উদ্দেশ্য প্রকাশের ভাষা যা দ্রুত, বহনযোগ্য এবং কার্যকর করার জন্য নিরাপদ। আপনি নিজেই CEL ব্যবহার করতে পারেন বা এটিকে একটি বড় পণ্যে এম্বেড করতে পারেন। সিইএল রাউটিং রিমোট প্রসিডিওর কল (RPCs) থেকে শুরু করে নিরাপত্তা নীতি সংজ্ঞায়িত করার জন্য বিভিন্ন ধরনের অ্যাপ্লিকেশনের জন্য উপযুক্ত। CEL এক্সটেনসিবল, প্ল্যাটফর্ম স্বাধীন, এবং কম্পাইল-একবার/মূল্যায়ন-অনেক কর্মপ্রবাহের জন্য অপ্টিমাইজ করা হয়েছে।
CEL বিশেষভাবে ব্যবহারকারী কোড কার্যকর করার জন্য নিরাপদ হতে ডিজাইন করা হয়েছিল। যদিও ব্যবহারকারীর পাইথন কোডে অন্ধভাবে eval()
কল করা বিপজ্জনক, আপনি নিরাপদে একজন ব্যবহারকারীর CEL কোড চালাতে পারেন। এবং যেহেতু CEL এমন আচরণকে বাধা দেয় যা এটিকে কম পারফরম্যান্স করে তোলে, এটি ন্যানোসেকেন্ড বা মাইক্রোসেকেন্ডে নিরাপদে মূল্যায়ন করে। CEL এর গতি এবং নিরাপত্তা এটিকে কর্মক্ষমতা-সমালোচনামূলক অ্যাপ্লিকেশনের জন্য আদর্শ করে তোলে।
CEL একক-লাইন ফাংশন বা ল্যাম্বডা এক্সপ্রেশনের অনুরূপ অভিব্যক্তিকে মূল্যায়ন করে। যদিও CEL সাধারণত বুলিয়ান সিদ্ধান্তের জন্য ব্যবহৃত হয়, আপনি JSON বা প্রোটোকল বাফার বার্তাগুলির মতো আরও জটিল বস্তু তৈরি করতেও এটি ব্যবহার করতে পারেন।
কেন CEL?
অনেক পরিষেবা এবং অ্যাপ্লিকেশন ঘোষণামূলক কনফিগারেশন মূল্যায়ন করে। উদাহরণ স্বরূপ, ভূমিকা-ভিত্তিক অ্যাক্সেস কন্ট্রোল (RBAC) হল একটি ঘোষণামূলক কনফিগারেশন যা ব্যবহারকারীর ভূমিকা এবং ব্যবহারকারীদের একটি সেট দিয়ে অ্যাক্সেসের সিদ্ধান্ত তৈরি করে। যদিও ঘোষণামূলক কনফিগারগুলি বেশিরভাগ ক্ষেত্রেই যথেষ্ট, কখনও কখনও আপনার আরও অভিব্যক্তিপূর্ণ শক্তির প্রয়োজন হয়। সেখানেই CEL আসে।
CEL এর সাথে একটি ঘোষণামূলক কনফিগারেশন প্রসারিত করার উদাহরণ হিসাবে, Google ক্লাউড আইডেন্টিটি এবং অ্যাক্সেস ম্যানেজমেন্ট (IAM) এর ক্ষমতা বিবেচনা করুন। যদিও RBAC সাধারণ ক্ষেত্রে, IAM CEL এক্সপ্রেশনগুলি অফার করে যাতে ব্যবহারকারীদের অনুরোধের প্রোটো বার্তার বৈশিষ্ট্য বা অ্যাক্সেস করা সম্পদ অনুসারে ভূমিকা-ভিত্তিক অনুদানের সুযোগকে আরও সীমাবদ্ধ করতে দেয়। ডেটা মডেলের মাধ্যমে এই ধরনের অবস্থার বর্ণনা করার ফলে একটি জটিল API পৃষ্ঠ তৈরি হবে যার সাথে কাজ করা কঠিন। পরিবর্তে, অ্যাট্রিবিউট-ভিত্তিক অ্যাক্সেস কন্ট্রোল (ABAC) সহ CEL ব্যবহার করে RBAC-এর একটি অভিব্যক্তিপূর্ণ এবং শক্তিশালী এক্সটেনশন।
CEL এর মূল ধারণা
CEL-তে, পরিবেশের বিরুদ্ধে একটি অভিব্যক্তি সংকলিত হয়। সংকলন ধাপ প্রোটোকল বাফার বিন্যাসে একটি বিমূর্ত সিনট্যাক্স ট্রি (AST) তৈরি করে। সংকলিত অভিব্যক্তি ভবিষ্যতে ব্যবহারের জন্য সংরক্ষণ করা হয় যত দ্রুত সম্ভব মূল্যায়ন রাখতে। একটি একক সংকলিত অভিব্যক্তি অনেকগুলি বিভিন্ন ইনপুট দিয়ে মূল্যায়ন করা যেতে পারে।
এখানে এই ধারণাগুলির কিছু ঘনিষ্ঠভাবে দেখুন।
অভিব্যক্তি
এক্সপ্রেশন ব্যবহারকারীদের দ্বারা লিখিত হয়. এক্সপ্রেশনগুলি একক-লাইন ফাংশন বডি বা ল্যাম্বডা এক্সপ্রেশনের অনুরূপ। যে ফাংশন স্বাক্ষরটি ইনপুট ঘোষণা করে তা CEL এক্সপ্রেশনের বাইরে লেখা হয় এবং CEL-এ উপলব্ধ ফাংশনগুলির লাইব্রেরি স্বয়ংক্রিয়ভাবে আমদানি করা হয়।
উদাহরণস্বরূপ, নিম্নলিখিত CEL এক্সপ্রেশনটি একটি অনুরোধ অবজেক্ট নেয় এবং অনুরোধে একটি claims
টোকেন অন্তর্ভুক্ত থাকে। অভিব্যক্তিটি একটি বুলিয়ান মান প্রদান করে যা নির্দেশ করে যে claims
টোকেন এখনও বৈধ কিনা।
একটি দাবি টোকেন প্রমাণীকরণের জন্য CEL এক্সপ্রেশনের উদাহরণ
// Check whether a JSON Web Token has expired by inspecting the 'exp' claim.
//
// Args:
// claims - authentication claims.
// now - timestamp indicating the current system time.
// Returns: true if the token has expired.
//
timestamp(claims["exp"]) < now
ব্যবহারকারীরা যখন CEL এক্সপ্রেশন সংজ্ঞায়িত করে, পরিষেবা এবং অ্যাপ্লিকেশনগুলি যেখানে এটি চলে সেই পরিবেশকে সংজ্ঞায়িত করে।
পরিবেশ
পরিবেশগুলি পরিষেবা দ্বারা সংজ্ঞায়িত করা হয় । CEL এম্বেড করা পরিষেবা এবং অ্যাপ্লিকেশনগুলি অভিব্যক্তি পরিবেশ ঘোষণা করে। পরিবেশ হল ভেরিয়েবল এবং ফাংশনের সংগ্রহ যা CEL এক্সপ্রেশনে ব্যবহার করা যেতে পারে।
উদাহরণ স্বরূপ, নিম্নলিখিত textproto
কোডটি request
সম্বলিত একটি পরিবেশ ঘোষণা করে এবং now
একটি CEL পরিষেবা থেকে CompileRequest
বার্তা ব্যবহার করে ভেরিয়েবল।
উদাহরণ CEL পরিবেশ ঘোষণা
# Format: $SOURCE_PATH/service.proto#CompileRequest
declarations {
name: "request"
ident {
type { message_type: "google.rpc.context.AttributeContext.Request" }
}
}
declarations {
name: "now"
ident {
type { well_known: "TIMESTAMP" }
}
}
প্রোটো-ভিত্তিক ঘোষণাগুলি সিইএল টাইপ-চেকার দ্বারা ব্যবহার করা হয় যাতে একটি অভিব্যক্তির মধ্যে সমস্ত শনাক্তকারী এবং ফাংশন রেফারেন্স সঠিকভাবে ঘোষণা করা হয় এবং ব্যবহার করা হয়।
অভিব্যক্তি প্রক্রিয়াকরণের পর্যায়গুলি
CEL এক্সপ্রেশন তিনটি পর্যায়ে প্রক্রিয়া করা হয়:
- পার্স
- চেক করুন
- মূল্যায়ন করুন
CEL ব্যবহারের সবচেয়ে সাধারণ প্যাটার্ন হল কনফিগারেশনের সময়ে এক্সপ্রেশনগুলি পার্স করা এবং পরীক্ষা করা, AST সংরক্ষণ করা এবং তারপর রানটাইমে বারবার AST পুনরুদ্ধার করা এবং মূল্যায়ন করা।
CEL প্রক্রিয়াকরণ পর্যায়গুলির চিত্রণ
CEL একটি ANTLR লেক্সার এবং পার্সার ব্যাকরণ ব্যবহার করে একটি মানব-পাঠযোগ্য অভিব্যক্তি থেকে AST-এ পার্স করা হয়। পার্স ফেজটি একটি প্রোটো-ভিত্তিক AST নির্গত করে যেখানে AST-এর প্রতিটি Expr
নোডে একটি পূর্ণসংখ্যা আইডি থাকে যা পার্সিং এবং চেক করার সময় তৈরি হওয়া মেটাডেটাতে সূচক করতে ব্যবহৃত হয়। পার্সিংয়ের সময় যে syntax.proto
ফাইলটি তৈরি হয় সেটি এক্সপ্রেশনের স্ট্রিং ফর্মে যা টাইপ করা হয়েছিল তার বিমূর্ত উপস্থাপনাকে উপস্থাপন করে।
একটি এক্সপ্রেশন পার্স করার পরে, এক্সপ্রেশনের সমস্ত পরিবর্তনশীল এবং ফাংশন শনাক্তকারী ঘোষণা করা হয়েছে এবং সঠিকভাবে ব্যবহার করা হচ্ছে তা নিশ্চিত করতে পরিবেশের বিরুদ্ধে টাইপ-চেক করা হয়। টাইপ-চেকার একটি checked.proto
ফাইল তৈরি করে যাতে টাইপ, ভেরিয়েবল এবং ফাংশন রেজোলিউশন মেটাডেটা অন্তর্ভুক্ত থাকে যা মূল্যায়নের দক্ষতাকে ব্যাপকভাবে উন্নত করতে পারে।
অবশেষে, একটি অভিব্যক্তি পার্স এবং চেক করার পরে, সঞ্চিত AST মূল্যায়ন করা হয়।
CEL মূল্যায়নকারীর তিনটি জিনিস প্রয়োজন:
- যেকোনো কাস্টম এক্সটেনশনের জন্য ফাংশন বাইন্ডিং
- পরিবর্তনশীল বাঁধাই
- মূল্যায়ন করার জন্য একটি AST
ফাংশন এবং ভেরিয়েবল বাইন্ডিংগুলি AST কম্পাইল করতে যা ব্যবহার করা হয়েছিল তার সাথে মেলে। এই ইনপুটগুলির যেকোনও একাধিক মূল্যায়ন জুড়ে পুনঃব্যবহার করা যেতে পারে, যেমন একটি AST-কে বহু সেট ভেরিয়েবল বাইন্ডিং জুড়ে মূল্যায়ন করা হয়, একই ভেরিয়েবলগুলি অনেক AST-এর বিরুদ্ধে ব্যবহৃত হয়, অথবা একটি প্রক্রিয়ার জীবনকাল জুড়ে ব্যবহৃত ফাংশন বাইন্ডিংগুলি (একটি সাধারণ ক্ষেত্রে)৷