以下のリソースを持つテンプレートをデプロイする際に、AWS CloudFormation のスタック作成が失敗します。

  1. AWS Lambda 関数のリソース
  2. Lambda 関数を参照する NotificationConfiguration プロパティを持つ Amazon S3 バケットのリソース
  3. Lambda 関数および S3 バケットにマッチする FunctionName プロパティおよび SourceArn プロパティを持つ Lambda アクセス許可リソース
    注: S3 イベントソースのために Lambda アクセス許可リソースには SourceAccount プロパティを追加しておくことをお勧めします。S3 の Amazon Resource Name (ARN) にはアカウント ID が含まれていないからです。SourceArn プロパティは、他の大部分のイベントソースには十分ですが、S3 イベントソースには SourceAccount プロパティを追加して、あなたがバケットを削除したら、誰かがそのバケットを作成し直して、新しい所有者にあなたの Lambda 関数を呼び出すための完全なアクセス許可を与えてしまうというようなシナリオから保護することを検討してください。

スタックが失敗すると、次のようなエラーが表示されます。

Unable to validate the following destination configurations

バケットを作成するとき、S3 は、バケットがイベントを Lambda 関数にプッシュするためのアクセス許可を持っているかどうかをチェックすることによって、通知構成を確認します。アクセス許可リソース (このチェックに合格するために必要) にはバケット名が必要です。したがって、アクセス許可リソースはバケットに依存し、バケットはアクセス許可リソースに依存します。

注: 次のような DependsOn リソース属性を実装することによって、この問題を解決しようとすると、次のようなエラーを受け取ります。

"MyS3BucketPermission": {
  "Properties": {
    "Action": "lambda:InvokeFunction",
    ...
    ...
    "SourceArn": {
      "Ref": "MyS3Bucket"
    }
  },
  "Type": "AWS::Lambda::Permission"
},
"Resources": {
  "MyS3Bucket": {
    "DependsOn" : "MyS3BucketPermission",

DependsOn リソース属性エラー:

Circular dependency between resources

この例では、S3 バケットリソースと Lambda アクセス許可リソースの SourceArn プロパティとの間に循環依存関係が存在します。いずれも存在しなかった場合、一方を作成するには他方が必要になるからです。

この問題が発生した場合、スタックパラメーターと共に Fn::Join 標準組み込み関数を使用することによって、循環依存関係を回避することができます。

...
"SourceArn": {
  "Fn::Join": [
    "",
    ["arn:aws:s3:::", {
        "Fn::Join": [".", [{
              "Ref": "BucketPrefix"
            }, {
              "Ref": "AWS::StackName"
            }
          ]
        ]
      }
    ]
  ]
}
},
"Type": "AWS::Lambda::Permission"

このアプローチを使うと、S3 が通知構成を確認して、問題なくバケットを作成することができるようになります。

別の可能性のある回避策は、次のとおりです。

  • 通知構成のないバケットを作成し、次のスタック更新に追加します。
  • 制約の少ない Lambda アクセス許可を作成します。たとえば、SourceArn を完全に省略することによって、特定の AWS アカウントの呼び出しを許可します。
  • スタックワークフローの最後で実行するカスタムリソースを作成します。このリソースによって、すべてのリソースが作成された後、バケットに通知構成が追加されます。

このページは役に立ちましたか? はい | いいえ

AWS サポートナレッジセンターに戻る

サポートが必要ですか?AWS サポートセンターをご覧ください。

公開日: 2017 年 10 月 3 日