web-dev-qa-db-ja.com

serverless.ymlファイルでAccountIdを変数として取得するにはどうすればよいですか?

ファイル内に動的にARNを作成したいのですが、現在のAccountIdを取得する必要があります。変数としてどのようにアクセスできますか?

例えば:

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

現在のregionaccountIdを参照する適切な方法は何ですか?

編集:(ソリューション)

Fn::Joinソリューションのさと冗長さのために、このソリューションにはあまり満足していませんが、私がやったことは、これらすべてをこの1か所にしか持たない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:(より良い解決策)

これは不十分に聞こえるかもしれませんが、最終的に私が行った解決策は、カスタム変数にハードコーディングすることです。実際には2つのアカウントがあり、カスタムビルドステップを使用して、次のようなアカウント固有の設定で2つのファイルをコピーします。

account.stag.yml
account.prod.yml

各ファイルは次のようになります。

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

ビルド時にアカウントを指定し、gulpを使用してすべてのビルドを実行します。

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
16
justin.m.chase

便利なサーバーレスプラグイン があります。https://www.npmjs.com/package/serverless-pseudo-parameters は、次のようなawsパラメーターを参照する機能を追加します。使用し始めたばかりの地域とアカウントID。

16
Sam J

サーバーレス自体はCloudFormation内で定義されているため、これらの変数を参照できませんが、サーバーレスでは公開されません。

リソースセクションでそれらが必要な場合は、「Ref」呼び出しを介して直接アクセスできます。

AWS CloudFormation疑似変数

これらの変数を関数環境変数として必要とする場合、サーバーレスで生成された関数コードをCloudFormationコードで上書きできます。

そのため、これを実現するには、次のパターンで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"
7
jens walter

AWS CloudFormationは 一部の変数AWS::AccountIdおよびAWS::Regionのように提供しますが、serverless.ymlファイルでは使用できません${AWS::AccountId}。これらはサポートされていません。

@ jens answer が正しい。 CloudFormation構文を使用する必要があります。以下の例では、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

この線:

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

地域とアカウントIDのハードコーディングと同じです:

Resource: "arn:aws:iot:us-east-1:1234567890:topic/foo"    
4
Zanon

既に回答済み であるため、Serverless Frameworkは現在、アカウントIDを取得する方法を提供していません。そのためにはCloudFormation構文を使用する必要があります。

ただし、IAMアクセスポリシーを定義する場合、AWSアカウントIDは必要ありません。アカウント番号を置く場所に*を置くだけです。アカウントIDは、次の場合に必要です。

  • アクセス許可を与えるのではなく、特定のリソースを識別するために(たとえば、ARNによって関数を呼び出すために)ARNを構築する場合。
  • 別のAWSアカウントと信頼関係を作成するとき。

次の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

できます。アカウント番号の代わりに*を使用し、${self:provider.region}を使用して、provider(us -east-1)。

0
Zanon