CloudFormation で AWS Serverless Application Model (SAM) テンプレートの循環依存を解決するにはどうすればよいですか?

最終更新日: 2021 年 8 月 31 日

AWS CloudFormation に AWS Serverless Application Model (SAM) テンプレートをデプロイすると、「リソース間の循環依存関係: [Function, Bucket, FunctionRole, FunctionUploadPermission].」というようなエラーが表示されます。

簡単な説明

以下のサンプル AWS SAM テンプレートを使用すると、CloudFormation でエラーが発生します。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Circular Dependency
Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub "{AWS::StackName}-${AWS::Region}-${AWS::AccountId}"
  Function:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: s3://mybucket/function.zip
      Runtime: nodejs12.x
      Handler: index.handler
      Policies:
        - Version: 2012-10-17
          Statement:
            - Effect: Allow
              Action: s3:GetObject*
              Resource: !Sub "arn:aws:s3:::${Bucket}*"
      Events:
        Upload:
          Properties:
            Bucket:
              Ref: Bucket
            Events: s3:ObjectCreated:*
          Type: S3

テンプレートでは、次の循環依存関係が作成されるため、エラーが発生します。

  1. Bucket リソースは、FunctionUploadPermission に依存します。
  2. FunctionUploadPermission は、Function に依存します。
  3. Function は、FunctionRole に依存します。
  4. FunctionRole は、Bucket リソースに依存し、これによりループが生じます。

注:エラーメッセージでは、FunctionUploadPermission リソースのタイプは AWS::Lambda::Permission です。 このリソースは、AWS::Serverless::FunctionEvents プロパティが指定されると、AWS SAM によって自動的に生成されます。FunctionRole リソースのタイプは AWS::IAM::Role です。このリソースは、AWS::Serverless::FunctionRole プロパティが指定されていない場合、AWS SAM によって自動的に生成されます。

循環依存関係を解決するには、バケットリソースへの動的参照を置き換えてループしないようにする必要があります。

解決方法

循環依存関係を持つ CloudFormation テンプレートを次のテンプレートに置き換えます。

Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Circular Dependency
Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub "${AWS::StackName}-${AWS::Region}-${AWS::AccountId}"
  Function:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: s3://mybucket/function.zip
      Runtime: nodejs12.x
      Handler: index.handler
      Policies:
        - Version: 2012-10-17
          Statement:
            - Effect: Allow
              Action: s3:GetObject*
              Resource: !Sub "arn:aws:s3:::${AWS::StackName}-${AWS::Region}-${AWS::AccountId}*"
      Events:
        Upload:
          Properties:
            Bucket:
              Ref: Bucket
            Events: s3:ObjectCreated:*
          Type: S3

テンプレートでは、ポリシーステートメントの Resources セクションのバケット名は、バケットリソースの BucketName プロパティで使用されているのと同じ擬似パラメータを使用します。これで、そのバケットを直接参照せずにバケット名を渡すことができます。その結果、循環依存ループがなくなるため、エラーは解決されます。このループとは、Bucket リソースに応じて FunctionRole から生じる循環依存ループのことを指しています。

注: s3://mybucket/function.zip をファイルの場所に置き換えてください。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?