用存储桶名称替换变量

时间:2019-11-28 09:05:50

标签: amazon-cloudformation

我有一个可以按预期工作的模板,它创建了一个S3存储桶和一些雅典娜查询。

https://datameetgeobk.s3.amazonaws.com/cftemplates/athena_saved_query_blog_partition_parquet.tpl

问题是: 如何用第一步中创建的存储桶名称替换S3存储桶名称“ athenadata162a”。

  

external_location ='s3:// athenadata162a / optimized-data11 /'

创建新存储桶的代码如下:

"myS3Bucket" : {
      "Type" : "AWS::S3::Bucket"
      },

按照建议,将代码更改为yaml并仍然出现此错误:

  

模板验证错误:模板错误:一个或多个Fn :: Sub   内在函数未指定预期参数。指定一个字符串   作为第一个参数,以及可选的第二个参数来指定   替换为字符串中的值的映射

代码:

Resources:
  myS3Bucket:
    Type: 'AWS::S3::Bucket'
  createTableASParquetPartioned:
    Type: 'AWS::Athena::NamedQuery'
    Properties:
      Database: default
      Description: Create table as parquet partitioned
      Name: Blog2createTableAS
      QueryString: !Sub
        - |-
          CREATE table new_parquet11 WITH (format='PARQUET',
          parquet_compression='SNAPPY',  partitioned_by=array['year'],
          external_location = 's3://myS3Bucket/optimized-data11/') AS SELECT
          id, date, element, datavalue, mflag, qflag, sflag, obstime,
          substr("date",1,4) AS year FROM original_csv WHERE
          cast(substr("date",1,4) AS bigint) >= 2015 AND cast(substr("date",1,4)
          AS bigint) <= 2019

2 个答案:

答案 0 :(得分:3)

通常,您使用{{3}}替换某些输入字符串中的变量。

在您的YAML中,情况类似于:

    QueryString: !Sub
      - |-
        CREATE table new_parquet11
        WITH (format='PARQUET', 
        parquet_compression='SNAPPY', 
        partitioned_by=array['year'], 
        external_location = 's3://${myS3Bucket}/optimized-data11/') 
        ...

对不起,我不会提供JSON语法,因为它对于多行值来说太可怕了。

答案 1 :(得分:0)

您可以执行external_location = 's3://${myS3Bucket}/optimized-data11/'