এডাব্লুএস ক্লাউডফর্মেশন - টেমপ্লেটগুলিতে কাস্টম ভেরিয়েবল


18

ক্লাউডফর্মেশন টেম্পলেট পরামিতি থেকে প্রাপ্ত প্রায়শই ব্যবহৃত মানগুলির জন্য শর্টকাটগুলি সংজ্ঞায়িত করার কোনও উপায় আছে কি?

উদাহরণ হিসেবে বলা যায় - আমি একটি স্ক্রিপ্ট যে ELB নামের সঙ্গে একটি মাল্টি জেড প্রকল্প স্ট্যাক সৃষ্টি পেয়েছেন projectএবং ELB পিছনে দুই স্থানেই বলা project-1এবং project-2। আমি কেবলমাত্র ELBHostNameটেমপ্লেটে প্যারামিটারটি দিয়েছি এবং পরে এটি নির্মাণে ব্যবহার করব:

"Fn::Join": [
    ".", [
        { "Fn::Join": [ "", [ { "Ref": "ELBHostName" }, "-1" ] ] },
        { "Ref": "EnvironmentVersioned" },
        { "Ref": "HostedZone" }
    ]
]

ইসি 2 হোস্টের নাম, রুট 53 রেকর্ড ইত্যাদি তৈরি করতে - এই নির্মাণ বা খুব অনুরূপ টেমপ্লেট জুড়ে বহুবার পুনরাবৃত্তি হয় etc.

বারবার এটির পুনরাবৃত্তি করার পরিবর্তে আমি এর আউটপুটটি Fn::Joinকোনও ধরণের ভেরিয়েবলের কাছে নির্ধারণ করতে চাই এবং কেবলমাত্র এটি উল্লেখ করি, যেমন আমি "Ref":বিবৃতি দিয়ে পারি ।

আদর্শভাবে কিছু:

Var::HostNameFull = "Fn::Join": [ ... ]
...
{ "Name": { "Ref": "Var::HostNameFull" } }

বা অনুরূপ সহজ কিছু।

অ্যামাজন ক্লাউডফর্মেশনের মাধ্যমে কি এটি সম্ভব?


আপনি কী ক্লাউডফর্মেশনে স্পষ্টভাবে যাচ্ছেন তা কি ELBHostName একটি পরামিতি পূর্ণ? যদি তাই হয় তবে কেন রেফ ব্যবহার করবেন? আপনার টেম্পলেটে ভেরিয়েবলগুলি অন্তর্ভুক্ত করতে এবং এটি ক্লাউডফর্মেশনে স্থানান্তরিত করার আগে এটিকে JSON এ রূপান্তর করতে গোঁফ ব্যবহার করতে পারে। আপনার প্রভিশন প্রক্রিয়াটি দেখতে কেমন তা নির্ভর করে।
কান্টসন

উত্তর:


5

আমি একই কার্যকারিতা খুঁজছিলাম। চাঁদমাইজারের পরামর্শ অনুসারে একটি নেস্টেড স্ট্যাক ব্যবহার করার বিষয়টি মাথায় আসে, তবে তখন আমি বুঝতে পারি যে আমার আসলে যা প্রয়োজন তা কাস্টম ফাংশন। ভাগ্যক্রমে ক্লাউডফোর্ডেশন এডাব্লুএস :: ক্লাউডফর্মেশন :: কাস্টম রিসোর্স ব্যবহারের অনুমতি দেয় যা কিছুটা কাজ করে, একজনকে এটি করতে দেয়। এটি কেবল ভেরিয়েবলের জন্য ওভারকিলের মতো মনে হয় (এমন কিছু আমি যুক্তি দিতাম যেটি ক্লাউডফর্মেশনটিতে প্রথম স্থানে থাকা উচিত ছিল), তবে এটি কাজটি সম্পন্ন করে এবং এর সাথে সাথে, সমস্ত পদক্ষেপের (পাইথন / নোড বেছে নিতে) অনুমতি দেয় / জাভা)। এটি লক্ষ করা উচিত যে ল্যাম্বদা ফাংশনগুলির জন্য অর্থ ব্যয় হয় তবে আমরা এখানে পেনিগুলি নিয়ে কথা বলি যদি আপনি আপনার স্ট্যাকগুলি প্রতি ঘন্টায় একাধিক বার তৈরি / মুছবেন না।

প্রথম পদক্ষেপটি হ'ল এই পৃষ্ঠায় একটি ল্যাম্বডা ফাংশন তৈরি করা যা ইনপুট মান গ্রহণ করা এবং আউটপুটে অনুলিপি করা ছাড়া কিছুই করে না। আমরা ল্যাম্বডা ফাংশনটি হরেক রকম পাগল স্টাফ করতে পারি, তবে একবার আমাদের পরিচয় ফাংশন হয়ে গেলে, অন্য কিছু সহজ। বিকল্পভাবে আমরা ল্যাম্বদা ফাংশনটি স্ট্যাকের মধ্যেই তৈরি হতে পারি। যেহেতু আমি 1 অ্যাকাউন্টে অনেকগুলি স্ট্যাক ব্যবহার করি, আমার কাছে লেফটভার ল্যাম্বদা ফাংশন এবং ভূমিকাগুলির পুরো গুচ্ছ থাকবে (এবং সমস্ত স্ট্যাকগুলি তৈরি করা দরকার --capabilities=CAPABILITY_IAM, যেহেতু এটিরও একটি ভূমিকা প্রয়োজন।

ল্যাম্বদা ফাংশন তৈরি করুন

  • ল্যাম্বদা হোম পৃষ্ঠায় যান এবং আপনার প্রিয় অঞ্চলটি নির্বাচন করুন
  • টেমপ্লেট হিসাবে "ফাঁকা ফাংশন" নির্বাচন করুন
  • "পরবর্তী" ক্লিক করুন (কোনও ট্রিগার কনফিগার করবেন না)
  • পূরণ করো:
    • নাম: ক্লাউডফর্মেশনআইডেন্টিটি
    • বর্ণনা: এটি কী পায় তা ফিরিয়ে দেয়, মেঘ গঠনে পরিবর্তনশীল সমর্থন vari
    • রানটাইম: পাইথন 2.7
    • কোড এন্ট্রি প্রকার: কোড ইনলাইন সম্পাদনা করুন
    • কোড: নীচে দেখুন
    • হ্যান্ডলার সঠিক নয়: index.handler
    • ভূমিকা: একটি কাস্টম রোল তৈরি করুন। এই সময়ে একটি পপআপ খোলে যা আপনাকে একটি নতুন ভূমিকা তৈরি করতে দেয়। এই পৃষ্ঠার সবকিছু গ্রহণ করুন এবং "অনুমতি দিন" ক্লিক করুন। এটি ক্লাউডওয়াচ লগগুলিতে পোস্ট করার অনুমতি সহ একটি ভূমিকা তৈরি করবে।
    • স্মৃতি: 128 (এটি সর্বনিম্ন)
    • সময়সীমা: 3 সেকেন্ড (প্রচুর পরিমাণে হওয়া উচিত)
    • ভিপিসি: ভিপিসি নেই

তারপরে কোড ক্ষেত্রের নীচে কোডটি অনুলিপি করুন। ফাংশনের শীর্ষটি হল সিএফএন-প্রতিক্রিয়া পাইথন মডিউলটির কোড , যা কোনও অদ্ভুত কারণে ক্লাউডফর্মেশনের মাধ্যমে ল্যাম্বডা-ফাংশনটি তৈরি করা হলে কেবল স্বয়ংক্রিয়ভাবে ইনস্টল হবে। handlerফাংশন স্বশাসিত প্রশংসনীয় নয়।

from __future__ import print_function
import json

try:
    from urllib2 import HTTPError, build_opener, HTTPHandler, Request
except ImportError:
    from urllib.error import HTTPError
    from urllib.request import build_opener, HTTPHandler, Request


SUCCESS = "SUCCESS"
FAILED = "FAILED"


def send(event, context, response_status, reason=None, response_data=None, physical_resource_id=None):
    response_data = response_data or {}
    response_body = json.dumps(
        {
            'Status': response_status,
            'Reason': reason or "See the details in CloudWatch Log Stream: " + context.log_stream_name,
            'PhysicalResourceId': physical_resource_id or context.log_stream_name,
            'StackId': event['StackId'],
            'RequestId': event['RequestId'],
            'LogicalResourceId': event['LogicalResourceId'],
            'Data': response_data
        }
    )
    if event["ResponseURL"] == "http://pre-signed-S3-url-for-response":
        print("Would send back the following values to Cloud Formation:")
        print(response_data)
        return

    opener = build_opener(HTTPHandler)
    request = Request(event['ResponseURL'], data=response_body)
    request.add_header('Content-Type', '')
    request.add_header('Content-Length', len(response_body))
    request.get_method = lambda: 'PUT'
    try:
        response = opener.open(request)
        print("Status code: {}".format(response.getcode()))
        print("Status message: {}".format(response.msg))
        return True
    except HTTPError as exc:
        print("Failed executing HTTP request: {}".format(exc.code))
        return False

def handler(event, context):
    responseData = event['ResourceProperties']
    send(event, context, SUCCESS, None, responseData, "CustomResourcePhysicalID")
  • "পরবর্তী" ক্লিক করুন
  • "ফাংশন তৈরি করুন" ক্লিক করুন

আপনি এখন "টেস্ট" বোতামটি নির্বাচন করে ল্যাম্বডা ফাংশনটি পরীক্ষা করতে পারেন এবং নমুনার টেম্পলেট হিসাবে "ক্লাউডফর্মেশন তৈরির অনুরোধ তৈরি করুন" নির্বাচন করুন। আপনার লগে দেখতে হবে যে ভেরিয়েবলগুলি এটি খাওয়ানো হয়, তা ফিরে আসে।

আপনার ক্লাউডফর্মেশন টেমপ্লেটে ভেরিয়েবল ব্যবহার করুন

এখন আমাদের কাছে এই ল্যাম্বদা ফাংশন রয়েছে, আমরা এটি ক্লাউডফর্মেশন টেম্পলেটগুলিতে ব্যবহার করতে পারি। প্রথমে ল্যাম্বডা ফাংশনটি নোট করুন ( ল্যাম্বডা হোম পৃষ্ঠায় যান , সদ্য তৈরি ফাংশনটি ক্লিক করুন, আরনের উপরের অংশে ডানদিকে হওয়া উচিত, এর মতো কিছু arn:aws:lambda:region:12345:function:CloudFormationIdentity)।

এখন আপনার টেমপ্লেটে, সংস্থান বিভাগে, আপনার ভেরিয়েবলগুলি নির্দিষ্ট করুন:

Identity:
  Type: "Custom::Variable"
  Properties:
    ServiceToken: "arn:aws:lambda:region:12345:function:CloudFormationIdentity"
    Arn: "arn:aws:lambda:region:12345:function:CloudFormationIdentity"

ClientBucketVar:
  Type: "Custom::Variable"
  Properties:
    ServiceToken: !GetAtt [Identity, Arn]
    Name: !Join ["-", [my-client-bucket, !Ref ClientName]]
    Arn: !Join [":", [arn, aws, s3, "", "", !Join ["-", [my-client-bucket, !Ref ClientName]]]]

ClientBackupBucketVar:
  Type: "Custom::Variable"
  Properties:
    ServiceToken: !GetAtt [Identity, Arn]
    Name: !Join ["-", [my-client-bucket, !Ref ClientName, backup]]
    Arn: !Join [":", [arn, aws, s3, "", "", !Join ["-", [my-client-bucket, !Ref ClientName, backup]]]]

প্রথমে আমি একটি Identityভেরিয়েবল নির্দিষ্ট করি যা ল্যাম্বদা ফাংশনের জন্য আরন ধারণ করে। এটিকে এখানে একটি ভেরিয়েবলের মধ্যে রাখার অর্থ এই যে আমাকে একবার এটি নির্দিষ্ট করতে হবে। আমি আমার সমস্ত ভেরিয়েবল টাইপ করি Custom::Variable। ক্লাউডফর্মেশন আপনাকে Custom::কাস্টম সংস্থানগুলির সাথে শুরু করে যে কোনও প্রকারের নাম ব্যবহার করতে দেয় ।

নোট করুন যে Identityভেরিয়েবলটিতে ল্যাম্বডা ফাংশনের জন্য দু'বার অর্ন রয়েছে। একবার ব্যবহার করার জন্য ল্যাম্বডা ফাংশন নির্দিষ্ট করতে হবে। ভেরিয়েবলের মান হিসাবে দ্বিতীয়বার।

এখন আমার Identityভেরিয়েবলটি রয়েছে তাই আমি নতুন ভেরিয়েবলগুলি সংজ্ঞায়িত করতে পারি ServiceToken: !GetAtt [Identity, Arn](আমি মনে করি জেএসএন কোড কিছুটা হওয়া উচিত "ServiceToken": {"Fn::GetAtt": ["Identity", "Arn"]})। আমি 2 টি নতুন ক্ষেত্র তৈরি করি, প্রতিটি 2 টি ক্ষেত্র সহ: নাম এবং অরণ। আমার বাকী টেম্পলেটটিতে আমি যখনই প্রয়োজন !GetAtt [ClientBucketVar, Name]বা !GetAtt [ClientBucketVar, Arn]যখনই এটি ব্যবহার করতে পারি।

সাবধানতা শব্দ

কাস্টম রিসোর্সগুলির সাথে কাজ করার সময়, যদি ল্যাম্বডা ফাংশনটি ক্র্যাশ হয়ে যায়, আপনি 1 থেকে 2 ঘন্টার মধ্যে আটকে রয়েছেন কারণ ক্লাউডফর্মেশন হাল ছাড়ার আগে এক ঘন্টার জন্য (ক্র্যাশড) ফাংশন থেকে জবাবের জন্য অপেক্ষা করে। সুতরাং আপনার ল্যাম্বদা ফাংশনটি বিকাশের সময় স্ট্যাকের জন্য একটি সংক্ষিপ্ত সময়সীমা নির্দিষ্ট করা ভাল।


দুর্দান্ত উত্তর! আমি এটি পড়েছি এবং এটি আমার স্ট্যাকগুলিতে চালিয়েছি, যদিও আমার জন্য, আমি আমার অ্যাকাউন্টে ল্যাম্বদা ফাংশনগুলির বিস্তার সম্পর্কে চিন্তা করি না এবং আমি টেম্পলেটগুলি পছন্দ করি (আমি cloudformation-toolমণিটি ব্যবহার করে মডুলারি করি), তাই আমি ল্যাম্বডা তৈরিতে প্যাক করে রাখি টেমপ্লেট এবং তারপরে এটি Identityকাস্টম সংস্থান তৈরির পরিবর্তে সরাসরি ব্যবহার করতে পারে । আমার কোডের জন্য এখানে দেখুন: gist.github.com/guss77/2471e8789a644cac96992c4102936fb3
গাস

আপনি যখন "... আপনি 1 থেকে 2 ঘন্টার মধ্যে আটকে আছেন ..." কারণ একটি ল্যাম্বডা ক্র্যাশ হয়ে গেছে এবং সিএফএন-প্রতিক্রিয়া দিয়ে জবাব দেয়নি, আপনি নিজে নিজে কার্ল / উইজেট ব্যবহার করে টেমপ্লেটটি আবার সরিয়ে নিতে পারেন can স্বাক্ষরিত ইউআরএল। ল্যাম্বডা শুরুতে ইভেন্ট / ইউআরএলটি সর্বদা মুদ্রণ করার বিষয়টি নিশ্চিত করুন যাতে আপনি ক্লাউডওয়াচে যেতে পারেন এবং URL টি যদি স্থির থাকে তবে তা পেতে পারেন।
টেলর

12

আমি কোন উত্তর না, কিন্তু ব্যবহারের মাধ্যমে নির্দেশ আপনি নিজেকে ব্যথা অনেক সঞ্চয় করতে পারেন যে চায়নি Fn::Subস্থানেFn::Join

{ "Fn::Sub": "${ELBHostName"}-1.${EnvironmentVersioned}.${HostedZone}"}

প্রতিস্থাপন

"Fn::Join": [
    ".", [
        { "Fn::Join": [ "", [ { "Ref": "ELBHostName" }, "-1" ] ] },
        { "Ref": "EnvironmentVersioned" },
        { "Ref": "HostedZone" }
    ]
]

3

না, আমি চেষ্টা করেছিলাম, কিন্তু খালি এসেছি। আমার কাছে যে উপায়টি উপলব্ধি করা হয়েছিল তা হ'ল "কাস্টমভ্যারিয়েবলস" নামে একটি ম্যাপিং এন্ট্রি তৈরি করা এবং সেই বাড়িতে আমার সমস্ত ভেরিয়েবলগুলি রাখা। এটি সরল স্ট্রিংয়ের জন্য কাজ করে তবে আপনি ম্যাপিংয়ের অভ্যন্তরে আন্তঃবিজ্ঞান (রেফস, এফএন :: যোগ দেয় ইত্যাদি) ব্যবহার করতে পারবেন না

কাজ করে:

"Mappings" : {
  "CustomVariables" : {
    "Variable1" : { "Value" : "foo" },
    "Variable2" : { "Value" : "bar" }
  }
}

কাজ করবে না:

  "Variable3" : { "Value" : { "Ref" : "AWS::Region" } }

এটি কেবল একটি উদাহরণ। আপনি কোনও চলকটিতে স্ট্যান্ড স্টোন রেফ রাখবেন না।


1
ডকুমেন্টেশন বলছে ম্যাপিংয়ের মানগুলি অবশ্যই আক্ষরিক স্ট্রিং হওয়া উচিত।
ইভান আনিশচুক

3

আপনি একটি নেস্টেড স্ট্যাক ব্যবহার করতে পারেন যা এর আউটপুটগুলিতে আপনার সমস্ত ভেরিয়েবলগুলি সমাধান করে এবং তারপরে Fn::GetAttস্ট্যাকটি থেকে আউটপুটগুলি পড়তে ব্যবহার করুন


2

আপনি নেস্টেড টেম্পলেটগুলি ব্যবহার করতে পারেন যাতে আপনি বাইরের টেম্পলেটে আপনার সমস্ত ভেরিয়েবলগুলি "সমাধান" করেন এবং সেগুলি অন্য কোনও টেম্পলেটে প্রেরণ করেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.