【问题标题】:Is it possible to use Ref function on option_settings in AWS?是否可以在 AWS 的 option_settings 上使用 Ref 函数?
【发布时间】:2021-01-14 12:23:45
【问题描述】:

我正在使用 Elastic Beanstalk 通过 SQS 部署工作层环境。

在我的.ebextensions 我有以下文件:

option_settings:
  aws:elasticbeanstalk:sqsd:
    WorkerQueueURL:
      Ref: WorkerQueue
    HttpPath: "/sqs/"
    InactivityTimeout: 1650
    VisibilityTimeout: 1680
    MaxRetries: 1

Resources:
  WorkerQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: "tpc-clients-aws-queue"
      VisibilityTimeout: 1680

但是,这会失败并出现以下错误:

其中一个配置文件中的“option_settings”验证失败。更多详情请关注。

无效的选项值:'Ref=WorkerQueue'(命名空间:'aws:elasticbeanstalk:sqsd',OptionName:'WorkerQueueURL'):值不满足正则表达式:'^$|^http(s)?://。 +$' [以 http(s) 开头的有效非空 URL]

AWSCloudFormation Ref function 似乎不能在option_settings 中使用。有人可以确认是否是这种情况吗?

我在 StackOverflow 上看到了一些使用 option_settings 中的内部函数的代码 sn-ps,例如在 this answermount-config.configthis question 中。那么,这些示例是否使用了无效的语法?或者option_settings上有一些内在的功能或者特定的资源可以使用?

最后,如果我不能使用 Ref 功能,我该怎么办?

【问题讨论】:

  • 进展如何?仍然不清楚你能做什么?你知道你可以接受你自己的答案来解决问题吗?

标签: amazon-web-services amazon-elastic-beanstalk amazon-cloudformation amazon-sqs


【解决方案1】:

是的,你可以参考.ebextentions,但是语法有点奇怪。它显示在文档here

您可以尝试以下方式(注意各种引号):

option_settings:
  aws:elasticbeanstalk:sqsd:
    WorkerQueueURL: '`{"Ref" : "WorkerQueue"}`'
    HttpPath: "/sqs/"
    InactivityTimeout: 1650
    VisibilityTimeout: 1680
    MaxRetries: 1

Resources:
  WorkerQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: "tpc-clients-aws-queue"
      VisibilityTimeout: 1680

如果您在输出中导出WorkerQueue,您也可以使用ImportValue

更新

要检查获得的值,可以将其设置为环境变量,并在 EB 控制台中检查:

option_settings:
    aws:elasticbeanstalk:application:environment:
        SQS_NAME: '`{"Ref" : "WorkerQueue"}`'

【讨论】:

  • 我刚刚尝试使用该语法,但仍然收到 Invalid option value:.. 错误。我也尝试使用输出和Fn::ImportValue 函数,但问题仍然存在。也许函数没有返回正确的 URL?你知道我该如何检查(即内部函数返回的值)吗?
  • @MartínDelaFuente 您可以转到 CloudFormation 控制台,找到 EB 创建的堆栈并检查其输出。您也可以使用 env 变量中的值来查看其值,如更新的答案中所示。
  • 检查 EB 控制台以检查 env 变量是没有用的,我不得不使用钩子检查它并且它有效。但是,对aws:elasticbeanstalk:sqsd:WorkerQueueURL 使用相同的表达式似乎是不可能的。检查我发布的答案。
  • @MartínDelaFuente 感谢您告诉我。
【解决方案2】:

在深入研究本期后,我发现了一些我想与未来读者分享的发现。

Ref 可用于option_settings

正如@Marcin 回答所述,Ref 内在函数可以option_settings 中使用。但是语法不同:

'`{"Ref" : "ResourceName"}`'

aws:elasticbeanstalk:application:environment(环境变量)上使用Ref

上述的一个用例是将队列URL存储在环境变量中,如下:

option_settings:
  aws:elasticbeanstalk:application:environment:
    QUEUE_URL: '`{"Ref" : "WorkerQueue"}`'

这将使您的 .sh 脚本访问队列的 URL:

请注意,如果您检查 Elastic Beanstalk 控制台(环境 > 配置 > 软件),您将看不到实际值:

aws:elasticbeanstalk:sqsd:WorkerQueueURL 上使用Ref

如果您尝试使用以下设置:

option_settings:
  aws:elasticbeanstalk:sqsd:
    WorkerQueueURL: '`{"Ref" : "WorkerQueue"}`'
    HttpPath: "/sqs/"

它会失败:

无效的选项值:'`{"Ref" : "WorkerQueue"}`'(命名空间:'aws:elasticbeanstalk:sqsd',OptionName:'WorkerQueueURL'):值不满足正则表达式:'^$|^http (s)?://.+$' [以 http(s) 开头的有效非空 URL]

这个配置选项好像不接受引用。

无需创建新队列并将其分配给 sqs 守护程序,您只需更新 Elastic Beanstalk 创建的队列即可:

option_settings:
  # SQS daemon will use default queue created by EB (AWSEBWorkerQueue)
  aws:elasticbeanstalk:sqsd:
    HttpPath: "/sqs/"

Resources:
  # Update the queue created by EB
  AWSEBWorkerQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: "tpc-clients-aws-queue"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-21
    • 2021-06-10
    • 2014-01-17
    • 2011-08-15
    • 2016-08-09
    • 2012-09-08
    • 1970-01-01
    • 2021-08-05
    相关资源
    最近更新 更多