簡體   English   中英

AWS:cloudformation CommaDelimitedList 和手動列表不匹配

[英]AWS: cloudformation CommaDelimitedList and manual list not matching

我正在嘗試創建一個具有默認值的 cloudformation 模板,並且正在運行一些!Sub函數來將導入的參數替換到模板中。 但是,我正在將一個列表傳遞給 nodejs Lambda function ,我需要在發送之前!Sub

我正在編寫的代碼:

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: Creating Athena database and tables

Parameters:
  S3DataLocations:
    Type: CommaDelimitedList
    Description: The S3 locations where the logs are read from (Specify 'Use,Default' to inherit defaults)
    Default: Use,Default

Conditions:
  CustomS3DataLocations: !Equals ['Use,Default', !Join [",", !Ref S3DataLocations]]

Resources:
  # Custom resource for running CreateTableFunction, to create databases
  CreateLogTable:
    Type: Custom::CreateLogTable
    Properties:
      ServiceToken: !GetAtt [CreateLogTableFunction, Arn]
      S3DataLocations:
        Fn::If:
          - CustomS3DataLocations
          - !Split
            - ","
            - !Sub
              - s3://${LoggingBucket}/data/ApplicationLogs1/,
                s3://${LoggingBucket}/data/ApplicationLogs2/,
                s3://${LoggingBucket}/data/ApplicationLogs3/
              - { LoggingBucket: !ImportValue Parent-LoggingBucket}
          - !Ref S3DataLocations

如果我將這些作為文字外部數據DataTypes參數傳遞s3://logbucket/data/ApplicationLogs1/,s3://logbucket/data/ApplicationLogs2/,s3://logbucket/data/ApplicationLogs3/它工作正常並轉換為["s3://logbucket/data/ApplicationLogs1/","s3://logbucket/data/ApplicationLogs2/","s3://logbucket/data/ApplicationLogs3/"]並由 Lambda 毫無問題地解釋。 該參數通過CommaDelimitedList類型進行解析,並毫無問題地傳遞給 Lambda。

出現問題是因為我正在嘗試創建手動默認值,所以我需要將!Sub列表作為字符串,然后將!Split作為實際列表傳遞給自定義 Lambda。這似乎不起作用我嘗試了每一種方式,但我不知道為什么。

我一直在檢查成功(手動參數)和失敗(默認值,沒有手動參數),我看不出有什么大的不同。 lambda 的事件顯示,工作時:

{
    "RequestType": "Create",
    "ServiceToken": "hidden",
    "ResponseURL": "hidden",
    "StackId": "hidden",
    "RequestId": "hidden",
    "LogicalResourceId": "CreateLogTable",
    "ResourceType": "Custom::CreateLogTable",
    "ResourceProperties": {
        "S3DataLocations": [
            "s3://loggingbucket/data/ApplicationLogs/",
            "s3://loggingbucket/data/ApplicationLogs/",
            "s3://loggingbucket/data/ApplicationLogs/",
            "s3://loggingbucket/data/ApplicationLogs/"
        ]
    }
}

當不工作時:

...
{
    "RequestType": "Create",
    "ServiceToken": "hidden",
    "ResponseURL": "hidden",
    "StackId": "hidden",
    "RequestId": "hidden",
    "LogicalResourceId": "CreateLogTable",
    "ResourceType": "Custom::CreateLogTable",
    "ResourceProperties": {
        "S3DataLocations": [
            "s3://logging/data/ApplicationLogs/",
            " s3://loggingbucket/data/ApplicationLogs/",
            " s3://loggingbucket/data/ApplicationLogs/",
            " s3://loggingbucket/data/ApplicationLogs/"
        ]
    }
}

我有點卡在這里,我認為可能存在一些類型不匹配,但我無法分辨手冊和參數之間的區別。

有人有什么主意嗎?

您可以使用引號和斜杠組合將字符串分成多行,同時防止將\n更改為空格。

為了驗證這一點,我針對您的情況使用了以下代理模板:


Resources:

  MyBucket:
    Type: AWS::S3::Bucket
    Properties: {}

Outputs:
  Test1:
    Value: !Sub
          - s3://${LoggingBucket}/data/ApplicationLogs1/,
            s3://${LoggingBucket}/data/ApplicationLogs2/,
            s3://${LoggingBucket}/data/ApplicationLogs3/
          - { LoggingBucket: "Parent-LoggingBucket"}

  Test2:
    Value: !Sub
          - "s3://${LoggingBucket}/data/ApplicationLogs1/,\
            s3://${LoggingBucket}/data/ApplicationLogs2/,\
            s3://${LoggingBucket}/data/ApplicationLogs3/"
          - { LoggingBucket: "Parent-LoggingBucket"}   

Test1生成帶有空格的字符串,如您的問題所示:

s3://Parent-LoggingBucket/data/ApplicationLogs1/, s3://Parent-LoggingBucket/data/ApplicationLogs2/, s3://Parent-LoggingBucket/data/ApplicationLogs3/

相比之下, Test2沒有空間:

s3://Parent-LoggingBucket/data/ApplicationLogs1/,s3://Parent-LoggingBucket/data/ApplicationLogs2/,s3://Parent-LoggingBucket/data/ApplicationLogs3/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM