2017-03-05 1 views
10

Ich möchte ein ARN in meiner Datei dynamisch erstellen, aber ich muss meine aktuelle AccountId abrufen. Wie kann ich darauf als Variable zugreifen?Wie bekomme ich die AccountId als Variable in einer serverless.yml-Datei?

Zum Beispiel:

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

Was ist der richtige Weg, um die aktuellen region und accountId zu verweisen?

Edit: (Lösung)

ich mit dieser Lösung nicht super zufrieden bin wegen der Hässlichkeit und Ausführlichkeit der Fn::Join Lösung, aber was ich am Ende tut, ist sie eine arns.yml-Datei, die alle diese hat nur an diesem einen Ort dann referenzieren Sie dann durch Variable woanders.

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

Dann:

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


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

Edit 2: (bessere Lösung)

Dies kann lahm klingen, aber die Lösung, die ich mit ist los am Ende nur schwer Code es in meine Gewohnheit Variablen. Ich habe eigentlich zwei Konten und ich verwende eine benutzerdefinierte Build-Schritt die beiden Dateien mit Kontospezifischen Einstellungen zu kopieren, wie so:

account.stag.yml 
account.prod.yml 

Jede Datei kann wie folgt aussehen:

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

Wenn ich baue ich angeben ein Konto und ich schluck alle meine Gebäude zu tun:

gulp build --account stag 

Dann, dass umbenennt mein Konto spezifische Einstellungen

build/account.yml 

Und ich kann es in meinem serverless.yml wie so Referenz:

# 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 

Antwort

5

Es gibt ein handliches serverloses Plugin https://www.npmjs.com/package/serverless-pseudo-parameters, das die Fähigkeit hinzufügt, aws Parameter wie Region und Konto-ID zu referenzieren, die ich gerade angefangen habe, mit viel Erfolg zu verwenden.

+0

Ich habe dieses Plugin noch nicht überprüft, aber das scheint die beste Antwort zu sein, um ehrlich zu sein, um die richtige Antwort zu sein. –

4

Serverless selbst nicht diese Variablen verweisen können, da die innerhalb Cloudformation definiert sind, aber nicht in serverless ausgesetzt.

Wenn Sie diese im Bereich Ressourcen benötigen, können Sie direkt über "Ref" -Ruf darauf zugreifen.

AWS CloudFormation Pseudo-variables

Wenn Sie diese Variable als Funktion von Umgebungsvariablen benötigen, können Sie die serverless generierten Funktionscode mit Cloudformation-Code zu überschreiben.

Um dies zu erreichen, müssen Sie Ihre serverless.yml mit dem folgenden Muster ändern.

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

AWS Cloudformation bietet some variables wie AWS::AccountId und AWS::Region, aber man kann sich nicht wie ${AWS::AccountId} in der serverless.yml Datei verwenden. Diese werden nicht unterstützt.

@jens answer ist richtig. Sie müssen die CloudFormation-Syntax verwenden. Im folgenden Beispiel biete ich eine andere Möglichkeit zur Verwendung von CloudFormation.

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 

Die Linie:

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

ist das gleiche von Hartcodierung der Region und Konto-ID:

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

Konnte diese Zeile durch 'Ressource: 'ersetzt werden! Sub arn: aws: iot: $ {AWS :: Region}: $ {AWS :: AccountId}: topic/foo''? – BamaPookie

+0

@BamaPookie, ich denke nicht. Es sollte nur funktionieren, wenn Sie [dieses Plugin] hinzufügen (https://www.npmjs.com/package/serverless-pseudo-parameters). – Zanon

1

Als already answered, derzeit der Serverless Rahmen bietet keine Möglichkeit, um die Konto-ID abzurufen. Sie müssen dazu die CloudFormation-Syntax verwenden. Wenn Sie eine IAM-Zugriffsrichtlinie definieren, benötigen Sie jedoch nicht die AWS-Konto-ID. Platzieren Sie einfach *, wo Sie die Kontonummer eingeben würden. Die Konto-ID ist notwendig, in den folgenden Fällen:

  • Wenn Sie eine ARN bauen eine bestimmte Ressource zu identifizieren (zum Beispiel eine Funktion, durch seine ARN aufzurufen), nicht Zugriffsberechtigungen zu geben.
  • Wenn Sie eine Vertrauensbeziehung mit einem anderen AWS-Konto erstellen.

Blick auf die folgenden serverless.yml Datei:

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 

Es funktioniert. Ich verwende * anstelle meiner Kontonummer und verwende ${self:provider.region}, um auf die Region zu verweisen, die ich in meinem Provider (us-east-1) festgelegt habe.

Verwandte Themen