0

ありがとうございます!AWS Cloudformation Lambda S3 - 循環依存性

だから私は下のこのCloudformationテンプレートを作成し、循環依存エラーを持っている..私は、エラーの原因を知っているが、私が達成しようとしている何のために解決策を考えることはできません。..

どのそうです。

  • 機能コードで、私が使用する必要がある2つのバケット

  • のための2つの環境変数が2つのS3バケット、ファイル入力用とファイル出力のための1つを作成しているラムダ関数を作成します。

  • オブジェクトが第一バケットここ

に追加されたラムダ関数を呼び出すトリガーを作成しますが、私のコードです:

 "lambda": { 
      "Type": "AWS::Lambda::Function", 
      "DependsOn": [ 
       "s3accessrole", 
       "s3rolepolicies", 
       "bucket1" 
      ], 
      "Properties": { 
       "Code": { 
        "S3Bucket": "resource-bucket", 
        "S3Key": "filepath/function.zip" 
       }, 
       "Role": { 
        "Fn::GetAtt": [ 
         "s3accessrole", 
         "Arn" 
        ] 
       }, 
       "Timeout": 60, 
       "Handler": "function.handler", 
       "Runtime": "nodejs6.10", 
       "MemorySize": 1024, 
       "Environment": { 
        "Variables": { 
         "bucket1": { 
          "Ref": "bucket1" 
         }, 
         "bucket2": { 
          "Ref": "bucket2" 
         } 
        } 
       } 
      }, 
      "Metadata": { 
       "AWS::CloudFormation::Designer": { 
        "id": "XXXX" 
       } 
      } 
     }, 
     "bucket1": { 
      "Type": "AWS::S3::Bucket", 
      "Properties": { 
       "AccessControl": "Private", 
       "LifecycleConfiguration": { 
        "Rules": [ 
         { 
          "ExpirationInDays": "1", 
          "Id": "delete images/", 
          "Status": "Enabled" 
         } 
        ] 
       }, 
       "VersioningConfiguration": { 
        "Status": "Suspended" 
       }, 
       "NotificationConfiguration": { 
        "LambdaConfigurations": [ 
         { 
          "Event": "s3:ObjectCreated:*", 
          "Function": { 
           "Ref": "lambda" 
          } 
         } 
        ] 
       } 
      }, 
      "Metadata": { 
       "AWS::CloudFormation::Designer": { 
        "id": "XXXX" 
       } 
      } 
     }, 
     "lambdaperm": { 
      "Type": "AWS::Lambda::Permission", 
      "Properties": { 
       "Action": "lambda:InvokeFunction", 
       "FunctionName": { 
        "Ref": "lambda" 
       }, 
       "Principal": "s3.amazonaws.com", 
       "SourceAccount": { 
        "Ref": "AWS::AccountId" 
       }, 
       "SourceArn": { 
        "Fn::Join": [ 
         ":", 
         [ 
          "arn", 
          "aws", 
          "s3", 
          "", 
          "", 
          { 
           "Ref": "bucket1" 
          } 
         ] 
        ] 
       } 
      }, 
      "Metadata": { 
       "AWS::CloudFormation::Designer": { 
        "id": "XXXX" 
       } 
      } 
     }, 
     "bucket2": { 
      "Type": "AWS::S3::Bucket", 
      "Properties": { 
       "AccessControl": "Private", 
       "LifecycleConfiguration": { 
        "Rules": [ 
         { 
          "ExpirationInDays": "1", 
          "Id": "delete images/", 
          "Status": "Enabled" 
         } 
        ] 
       }, 
       "VersioningConfiguration": { 
        "Status": "Suspended" 
       } 
      }, 
      "Metadata": { 
       "AWS::CloudFormation::Designer": { 
        "id": "XXXX" 
       } 
      } 
     } 
+1

ラムダコードに2つのバケットの名前が必要なのはなぜですか? 1つを入力として使用し、1つを出力として使用する場合、入力イベントは入力バケットの名前を提供します。したがって、(1)出力バケットの作成、(2)出力バケットへのrefを使用したLambda関数の作成、(3)Lambda関数を指し示すトリガーでの入力バケットの作成を行うことができます。サークルはありません! –

答えて

0

ラムダ関数の最初のバケットからの受信イベントには、そのバケットに使用された名前が含まれていたため、環境変数を作成する必要はありませんでした。

+0

これは本当です。ただし、ラムダの実行ロール(あなたがs3accessroleとして持っているもの)は、S3バケットの名前(バケット1のもの)を明示的に指定するパーミッションを持つCloudFormationテンプレートで定義されていないことを確認する必要があります。 これを定義して、特定のS3メソッドを許可することができます。 s3:GetObjectですが、リソースは '*'にする必要があります。残念ながら、そのバケツにロックすることはできません。これは、おそらくあなたがここで欲しかったことでしょう。 – pisomojado