ファイル内に動的にARNを作成したいのですが、現在のAccountIdを取得する必要があります。変数としてどのようにアクセスできますか?
例えば:
example: arn:aws:states:${region}:${accountId}:stateMachine:${self:service}-${self:custom.stage}-example
現在のregion
とaccountId
を参照する適切な方法は何ですか?
編集:(ソリューション)
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
便利なサーバーレスプラグイン があります。https://www.npmjs.com/package/serverless-pseudo-parameters は、次のようなawsパラメーターを参照する機能を追加します。使用し始めたばかりの地域とアカウントID。
サーバーレス自体はCloudFormation内で定義されているため、これらの変数を参照できませんが、サーバーレスでは公開されません。
リソースセクションでそれらが必要な場合は、「Ref」呼び出しを介して直接アクセスできます。
これらの変数を関数環境変数として必要とする場合、サーバーレスで生成された関数コードを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"
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"
既に回答済み であるため、Serverless Frameworkは現在、アカウントIDを取得する方法を提供していません。そのためにはCloudFormation構文を使用する必要があります。
ただし、IAMアクセスポリシーを定義する場合、AWSアカウントIDは必要ありません。アカウント番号を置く場所に*
を置くだけです。アカウントIDは、次の場合に必要です。
次の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)。