2017-03-05 5 views
10

मैं अपनी फ़ाइल में गतिशील रूप से एक एआरएन बनाना चाहता हूं, लेकिन मुझे अपना वर्तमान खाता आईडी प्राप्त करना होगा। मैं इसे चर के रूप में कैसे एक्सेस कर सकता हूं?मैं serverId को serverless.yml फ़ाइल में चर के रूप में कैसे प्राप्त करूं?

example: arn:aws:states:${region}:${accountId}:stateMachine:${self:service}-${self:custom.stage}-example 

संदर्भ के लिए वर्तमान region और accountId उचित तरीका क्या है:

उदाहरण के लिए

?

संपादित करें: (समाधान)

मैं कुरूपता और Fn::Join समाधान के शब्दाडंबर लेकिन मैं क्या कर रहा है जो इन सब है एक arns.yml फ़ाइल बना रहा है समाप्त हो गया की वजह से इस समाधान के साथ सुपर खुश नहीं हूँ केवल एक ही स्थान पर फिर संदर्भ के साथ कहीं और संदर्भ।

# arns.yml 
example: 
    Fn::Join: 
    - ":" 
    - - arn 
     - aws 
     - states 
     - Ref: AWS::Region 
     - Ref: AWS::AccountId 
     - stateMachine 
     - ${self:service}-${self:custom.stage}-example 

तब:

# serverless.yml 
custom: 
    stage: "${opt:stage, self:provider.stage}" 


functions: 
    foo: 
    handler: handler.foo 
    environment: 
     example_arn: ${file(arns.yml):example} 

संपादित करें 2: (बेहतर समाधान)

यह लंगड़ा लग सकता है लेकिन समाधान मैं के साथ जा रहा समाप्त हो गया अपने कस्टम में सिर्फ कठिन कोड यह करने के लिए है चर। मैं वास्तव में दो खाते हैं और मैं एक कस्टम निर्माण कदम उपयोग करती हैं इसलिए की तरह खाते विशिष्ट सेटिंग्स के साथ दो फ़ाइलों की प्रतिलिपि बनाना:

account.stag.yml 
account.prod.yml 

प्रत्येक फ़ाइल इस तरह दिखना हो सकता है:

# account.stag.yml 
account: 123456789 
region: ${opt:region, "us-east-1"} 
domain: mycompany.qa 

जब मैं मेरे द्वारा उल्लिखित का निर्माण एक खाता और मैं घूंट का उपयोग अपने भवन के सभी कार्य करें:

को

gulp build --account stag 

तो है कि मेरे खाते विशिष्ट सेटिंग का नाम बदलता है

build/account.yml 

और मैं तो जैसे मेरी serverless.yml में यह देख सकते हैं:

# build/serverless.yml 
custom: ${file(account.yml)} 
functions: 
    foo: 
    handler: handler.foo 
    environment: 
     example_arn: arn:aws:states:${self:custom.region}:${self:custom.account}:${self:service}-${opt:stage}-example 

उत्तर

5

एक आसान सर्वर रहित प्लगइन https://www.npmjs.com/package/serverless-pseudo-parameters है जो क्षेत्र और खाता आईडी जैसे aws पैरामीटर को संदर्भित करने की क्षमता को जोड़ता है जिसे मैंने अभी तक बहुत सफलता के लिए उपयोग करना शुरू कर दिया है।

+0

मैंने अभी तक इस प्लगइन को नहीं देखा है लेकिन यह ईमानदार होने का सबसे अच्छा जवाब है, सही जवाब होने के लिए स्विच किया गया है। –

4

Serverless ही वे चर संदर्भ नहीं दे सकता, क्योंकि वे CloudFormation भीतर परिभाषित कर रहे हैं, लेकिन serverless में उजागर नहीं।

यदि आपको संसाधन अनुभाग में उन लोगों की आवश्यकता है तो आप सीधे उन्हें "रेफरी" के माध्यम से एक्सेस कर सकते हैं।

AWS CloudFormation Pseudo-variables

आप समारोह वातावरण चर के रूप में उन चर की जरूरत है, तो आप CloudFormation कोड के साथ serverless उत्पन्न समारोह कोड के ऊपर लिख सकते हैं।

तो इसे प्राप्त करने के लिए, आपको निम्न पैटर्न द्वारा serverless.yml को संशोधित करना होगा।

functions: 
    hello: 
    handler: handler.hello 
resources: 
    Resources: 
    HelloLambdaFunction: 
    Type: AWS::Lambda::Function 
    Properties: 
     Environment: 
     Variables: 
      accountId: 
      Ref: AWS::AccountId 
      region: 
      Ref: AWS::Region 
      arn: 
      Fn::Join: 
       - "" 
       - - "arn:aws:states:" 
       - Ref: AWS::Region 
       - ":" 
       - Ref: AWS::AccountId 
       - ":stateMachine:" 
       - ${self:service} 
       - "-" 
       - ${self:custom.stage} 
       - "-example" 
2

एडब्ल्यूएस CloudFormation some variablesAWS::AccountId और AWS::Region की तरह प्रदान करता है, लेकिन आप serverless.yml फ़ाइल ${AWS::AccountId} की तरह में उनका उपयोग नहीं कर सकते हैं। वे समर्थित नहीं हैं।

@jens answer सही है। आपको क्लाउडफॉर्मेशन सिंटैक्स का उपयोग करना होगा। नीचे दिए गए उदाहरण में, मैं क्लाउडफॉर्मेशन का उपयोग करने का एक और तरीका प्रदान करता हूं।

service: testing-aws-account-id 

provider: 
    name: aws 
    runtime: nodejs4.3 
    region: us-east-1 
    iamRoleStatements: 
    - Effect: "Allow" 
     Action: 
     - "iot:Publish" 
     Resource: 'Fn::Join: ["", [ "aws:iot:", { "Ref": "AWS::Region" }, ":", { Ref: "AWS::AccountId" }, ":topic/foo" ]]' 

functions: 
    publishIot: 
    handler: handler.publishIot 

लाइन:

Resource: "arn:aws:iot:us-east-1:1234567890:topic/foo"  
+0

क्या उस पंक्ति को 'संसाधन:' के साथ प्रतिस्थापित किया जा सकता है! उप arn: aws: iot: $ {AWS :: क्षेत्र}: $ {AWS :: AccountId}: विषय/foo''? – BamaPookie

+0

@ बामापुकी, मुझे ऐसा नहीं लगता है। यह केवल तभी काम करना चाहिए जब आप [यह प्लगइन] जोड़ते हैं (https://www.npmjs.com/package/serverless-pseudo-parameters)। – Zanon

1

already answered के रूप में, Serverless फ्रेमवर्क वर्तमान में एक तरीका प्रदान नहीं करता है:

Resource: 'Fn::Join: ["", [ "aws:iot:", { "Ref": "AWS::Region" }, ":", { Ref: "AWS::AccountId" }, ":topic/foo" ]]' 

हार्ड-कोड क्षेत्र और खाता आईडी का एक ही है खाता आईडी पुनर्प्राप्त करने के लिए। इसके लिए आपको क्लाउडफॉर्मेशन सिंटैक्स का उपयोग करना होगा।

हालांकि, यदि आप आईएएम एक्सेस पॉलिसी को परिभाषित कर रहे हैं, तो आप को एडब्ल्यूएस खाता आईडी की आवश्यकता नहीं है। बस * रखें जहां आप खाता संख्या डाल देंगे। खाता आईडी निम्नलिखित मामलों में आवश्यक है:

  • जब आप (उदाहरण के लिए, अपने ARN द्वारा एक समारोह आह्वान करने के लिए) किसी विशिष्ट संसाधन की पहचान के लिए एक ARN निर्माण कर रहे हैं, पहुँच अनुमतियाँ देने के लिए नहीं।
  • जब आप किसी अन्य एडब्ल्यूएस खाते के साथ ट्रस्ट रिलेशनशिप बना रहे हैं। निम्नलिखित serverless.yml फ़ाइल पर

देखो:

service: testing-aws-account-id 

provider: 
    name: aws 
    runtime: nodejs4.3 
    region: us-east-1 
    iamRoleStatements: 
    - Effect: "Allow" 
     Action: 
     - "iot:Publish" 
     Resource: "arn:aws:iot:${self:provider.region}:*:topic/foo" 

functions: 
    publishIot: 
    handler: handler.publishIot 

यह काम करता है। मैं अपने खाता संख्या के बजाय * का उपयोग कर रहा हूं और मैं अपने प्रदाता (us-east-1) में सेट किए गए क्षेत्र का संदर्भ देने के लिए ${self:provider.region} का उपयोग कर रहा हूं।

संबंधित मुद्दे