Импорт s3 Bucket в шаблон Cloudformation

В шаблоне Cloudformation я определяю два сегмента S3.

 Bucket1:
  Type: AWS::S3::Bucket
  Properties:
   ...
 Bucket2:
  Type: AWS::S3::Bucket
  Properties:
   ...

Outputs:
 Bucket1:
  Description: S3 Bucket
  Value: !Ref Bucket1
  Export:
   Name: !Sub "${AWS::StackName}:Bucket1"
 Bucket2:
  Description: S3 Bucket
  Value: !Ref Bucket2
  Export:
   Name: !Sub "${AWS::StackName}:Bucket2"

Я использую эти экспортированные сегменты в двух разных шаблонах облачной информации.

Шаблон 1

Parameters:
 LoaderCodeBucket:
  Type: String

Resources:
 MyLambdaFunction:
  Type: AWS::Lambda::Function
  Properties:
   Code:
    S3Bucket:
     Fn::ImportValue:
      !Sub "${LoaderCodeBucket}:Bucket1"

Шаблон 2

Parameters:
 ProcessorCodeBucket:
  Type: String

Resources:
 MyOtherLambdaFunction:
  Type: AWS::Lambda::Function
  Properties:
   Code:
    S3Bucket:
     Fn::ImportValue:
      !Sub "${ProcessorCodeBucket}:Bucket2"

Шаблон 1 проходит aws cloudformation validate-template --template-body ..., а шаблон 2 не проходит из-за

Ошибка шаблона: атрибут в Fn :: ImportValue не должен зависеть от каких-либо ресурсов, импортированных значений или Fn :: GetAZ.

Единственное отличие состоит в том, что лямбда-функция в шаблоне 2 используется в приложении аналитики aws, которое также определено в шаблоне 2.

Я точно знаю, что проблемы возникают из-за S3 Bucket, потому что, когда я удаляю этот раздел кода, он проходит проверку.

Я использую этот сайт, чтобы попытаться отладить эту проблему, но, похоже, ни один из вопросов не дает ответа на эту конкретную проблему.

Это в том же регионе / той же учетной записи.

Мой вопрос: почему этот конкретный раздел кода (шаблон 2) выдает ошибку шаблона, когда шаблон 1 проходит без ошибок?

Куда присваивается ProcessorCodeBucket? Вероятно, разница в том, как заполняется ProcessorCodeBucket, и как заполняется LoaderCodeBucket   —  person DanSchneiderNA    schedule 02.02.2021

Что вы имеете в виду, как это назначается? Корзины заполняются из внешнего репо, которое загружает zip-файл с кодом, который находится во внешнем репо. Обе корзины заполняются из одного и того же внешнего репо.   —  person DanSchneiderNA    schedule 02.02.2021

См. также:  Как получить доступ к кросс-региональной корзине s3 с помощью лямбда-выражения с помощью CDK Python
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. DanSchneiderNA

    Это рабочий пример.

    Шаблон 1:

    AWSTemplateFormatVersion: "2010-09-09"
    Description: "Test"
    Resources:
      MyBucketOne:
        Type: "AWS::S3::Bucket"
        Properties:
          BucketName: bucket-one-12341234
      MyBucketTwo:
        Type: "AWS::S3::Bucket"
        Properties:
          BucketName: bucket-two-12341234
    Outputs:
      MyBucketOneOutput:
        Description: "Bucket Name of BucketOne"
        Value: !Ref MyBucketOne
        Export:
          Name: !Sub "${AWS::StackName}-BucketOne"
      MyBucketTwoOutput:
        Description: "Bucket Name of BucketTwo"
        Value: !Ref MyBucketTwo
        Export:
          Name: !Sub "${AWS::StackName}-BucketTwo"
    

    Шаблон 2: мы можем импортировать его как !ImportValue my-s3-BucketOne

    AWSTemplateFormatVersion: "2010-09-09"
    Description: "Test"
    Resources:
      MyLambda:
        Type: "AWS::Lambda::Function"
        Properties:
          Handler: index.handler
          Runtime: nodejs12.x
          FunctionName: "test-s3-import"
          Code:
            S3Bucket: !ImportValue my-s3-BucketOne
            S3Key: "index.zip"
          Description: "Test Lambda"
          MemorySize: 128
          Timeout: 60
          Role: test-role-arn
    

    Если вы действительно хотите использовать параметр из параметра, это будет Fn::ImportValue: !Sub ${BucketExportNamePrefix}-BucketOne

    AWSTemplateFormatVersion: "2010-09-09"
    Description: "Test"
    Parameters:
      BucketExportNamePrefix:
        Type: String
        Default: "my-s3"
    
    Resources:
      MyLambda:
        Type: "AWS::Lambda::Function"
        Properties:
          Handler: index.handler
          Runtime: nodejs12.x
          FunctionName: "test-s3-import"
          Code:
            S3Bucket:
              Fn::ImportValue: !Sub ${BucketExportNamePrefix}-BucketOne
            S3Key: "index.zip"
          Description: "Test Lambda"
          MemorySize: 128
          Timeout: 60
          Role: test-role-arn
    
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: