- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在使用 CloudFormation 模板时,我发现“自定义资源”功能及其 Lambda 支持函数实现对于处理 CloudFormation 无法提供良好支持的各种任务非常有用。
通常,我使用自定义资源在堆栈创建期间进行设置(例如查找 AMI 名称)或在删除期间清理内容(例如从 S3 或 Route53 中删除会阻止删除的对象) - 这非常有效。
但是当我尝试实际使用“自定义资源”来管理实际的自定义资源时,必须在堆栈创建期间创建该资源,在堆栈删除期间删除该资源,并且 - 这就是问题所在 - 有时会使用新值进行更新在堆栈更新期间,CloudFormation 集成行为异常并导致自定义资源失败。
问题似乎是,在堆栈更新期间,其中一个自定义资源属性发生更改,在堆栈的 UPDATE_IN_PROGRESS
阶段,CloudFormation 向支持 Lambda 函数发送一个更新事件,其中所有值均设置正确,并提供了旧值也发送。但更新完成后,CloudFormation 启动 UPDATE_COMPLETE_CLEANUP_IN_PROGRESS
阶段并向支持 Lambda 函数发送删除事件( RequestType
设置为 Delete
)。
发生这种情况时,后备 lambda 函数会假定堆栈正在被删除并删除自定义资源。结果是更新后自定义资源消失了。
我查看了日志中的请求数据,“清理删除”看起来与真正的“删除”事件相同:
{
RequestType: 'Delete',
ServiceToken: 'arn:aws:lambda:us-east-2:1234567890:function:stackname-resname-J0LWT56QSPIA',
ResponseURL: 'https://cloudformation-custom-resource-response-useast2.s3.us-east-2.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-2%3A1234567890%3Astack/stackname/3cc80cf0-5415-11e8-b6dc-503f3157b0d1%7Cresnmae%7C15521ba8-1a3c-4594-9ea9-18513efb6e8d?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20180511T140259Z&X-Amz-SignedHeaders=host&X-Amz-Expires=7199&X-Amz-Credential=AKISOMEAWSKEYID%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Signature=3abc68e1f8df46a711a2f6084debaf2a16bd0acf7f58837b9d02c805975df91b',
StackId: 'arn:aws:cloudformation:us-east-2:1234567890:stack/stackname/3cc80cf0-5415-11e8-b6dc-503f3157b0d1',
RequestId: '15521ba8-1a3c-4594-9ea9-18513efb6e8d',
LogicalResourceId: 'resname',
PhysicalResourceId: '2018/05/11/[$LATEST]28bad2681fb84c0bbf80990e1decbd97',
ResourceType: 'Custom::Resource',
ResourceProperties: {
ServiceToken: 'arn:aws:lambda:us-east-2:1234567890:function:stackname-resname-J0LWT56QSPIA',
VpcId: 'vpc-35512e5d',
SomeValue: '4'
}
}
{
RequestType: 'Delete',
ServiceToken: 'arn:aws:lambda:us-east-2:1234567890:function:stackname-resname-J0LWT56QSPIA',
ResponseURL: 'https://cloudformation-custom-resource-response-useast2.s3.us-east-2.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-2%3A1234567890%3Astack/stackname/3cc80cf0-5415-11e8-b6dc-503f3157b0d1%7Cresname%7C6166ff92-009d-47ac-ac2f-c5be2c1a7ab2?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20180524T154453Z&X-Amz-SignedHeaders=host&X-Amz-Expires=7200&X-Amz-Credential=AKISOMEAWSKEYID%2F20180524%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Signature=29ca1d0dbdbe9246f7f82c1782726653b2aac8cd997714479ab5a080bab03cac',
StackId: 'arn:aws:cloudformation:us-east-2:123456780:stack/stackname/3cc80cf0-5415-11e8-b6dc-503f3157b0d1',
RequestId: '6166ff92-009d-47ac-ac2f-c5be2c1a7ab2',
LogicalResourceId: 'resname',
PhysicalResourceId: '2018/05/11/[$LATEST]c9494122976b4ef3a4102628fafbd1ec',
ResourceType: 'Custom::Resource',
ResourceProperties: {
ServiceToken: 'arn:aws:lambda:us-east-2:1234567890:function:stackname-resname-J0LWT56QSPIA',
VpcId: 'vpc-35512e5d',
SomeValue: '0'
}
}
我能看到的唯一有趣的请求字段是物理资源 ID 不同,但我不知道将其与什么关联起来,以检测它是否是真正的删除。
最佳答案
问题似乎是用于将自定义资源完成事件发送回 CloudFormation 的 sendResponse()
函数的示例实现。该方法负责设置自定义资源的物理资源ID。据我了解,该值表示由支持 CloudFormation 自定义资源的 Lambda 函数管理的“外部资源”的全局唯一标识符。
如CloudFormation's "Lambda-backed Custom Resource" sample code中所示,以及 cfn-response
NPM module的 send()
和 CloudFormation's built-in cfn-response
module ,如果未作为第 5 个参数提供,此方法具有计算物理资源 ID 的默认行为,并且它使用正在处理正在处理的请求的日志记录的 CloudWatch Logs 日志流:
var responseBody = JSON.stringify({
...
PhysicalResourceId: context.logStreamName,
...
})
由于 CloudFormation(或 AWS Lambda 运行时?)偶尔会将日志流更改为新的日志流,因此 sendResponse()
生成的物理资源 ID 会不时发生意外变化,并使 CloudFormation 感到困惑.
据我了解,CloudFormation 托管实体有时需要在更新期间进行替换(一个很好的例子是 RDS::DBInstance
,几乎任何更改都需要替换)。 CloudFormation 的策略是,如果某个资源需要替换,则在“更新阶段”创建新资源,并在“清理阶段”删除旧资源。
因此使用默认的sendResponse()
物理资源ID计算,过程如下所示:
解决方案,至少在我从不“替换外部资源”的情况下,是为托管资源创建一个唯一标识符,将其作为发送响应例程的第五个参数提供,然后坚持下去 - 保留在更新响应中发送在更新请求中接收到的相同物理资源ID。然后,CloudFormation 在“清理阶段”永远不会发送删除请求。
我的实现(在 JavaScript 中)看起来像这样:
var resID = event.PhysicalResourceId || uuid();
...
sendResponse(event, context, status, resData, resID);
另一种替代方案(可能仅在您确实需要替换外部资源并希望遵守在清理期间删除旧资源的 CloudFormation 模型时才有意义)是使用实际的外部资源 ID 作为物理资源 ID ,并且当收到删除请求时 - 使用提供的物理资源 ID 删除旧的外部资源。这就是 CloudFormation 设计者最初可能想到的,但他们的默认示例实现会引起很多困惑 - 可能是因为示例实现不管理真正的资源并且没有更新功能。 CloudFormation 中也有零文档来解释设计和推理。
关于amazon-web-services - 更新自定义资源会导致它们被删除吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50599602/
我有一个几乎可以构建的Maven / Grails应用,但在web.xml上找不到[my-app]\webapp\WEB-INF\web.xml。但是目录结构像往常一样包含web-app文件夹,而不是
正如我在标题中提到的:我想知道 web-service 和 web-socket 之间的区别?我们什么时候使用每一个? 谢谢! 最佳答案 一个web service是一个响应客户端 SOAP/REST
让我们看一个示例场景: 客户端打开一个网站并找到他从文本框中输入的两个数字的总和。然后单击“添加”按钮。两个参数通过 HTTP GET 发送到服务器,在服务器上写入 PHP 代码以添加数字,结果为回声
我知道这是一个老问题,肯定已经被回答了数百次,但我还无法找到令人满意的答案。 我正在创建一个应用程序,其他应用程序(移动/网络)将使用该应用程序来获取数据。现在我有两个选择: 将我的应用程序创建为简单
通过 Web 作业部署新功能有 3 种方法: 创建一个新的 Web 应用,并部署一个包含该函数的 Web 作业。 向现有 Web 作业添加一项新函数(这样您现在在一个 Web 作业中就拥有了多个函数)
我收到来自网络场景的通知,上面写着“问题”和“确定”。我想在问题发生时包含网络响应的内容。我不担心标题值,只担心网页的内容. 这是我可以在通知设置中引用的变量吗? 最佳答案 不幸的是 zabbix 不
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
嗨,这是一个理论问题,但我真的无法弄清楚 Web 应用程序、基于 Web 的应用程序和基于云的应用程序之间的区别。这个你能帮我吗。 最佳答案 @Matt 是对的 - 这真的无关紧要,但是,为了清楚起见
我正在尝试使用多个 Web 服务,这些服务在它们的 wsdl 中重新定义了一些相同的公共(public)类。我目前在网站中引用了它们,但我想转换为 Web 应用程序。 由于一些相同的类是从多个 Web
一个。我必须考虑哪些事项?b.当前应用程序正在执行多个存储过程。如果我创建等效的方法来执行这些过程,会有什么风险或挑战。 最佳答案 在架构上,将网络应用程序转换为网络服务时必须考虑的一件事是,对方法和
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 5年前关闭。 Improve thi
网络 API 和网络服务之间有什么区别吗?或者它们是同一个吗? 最佳答案 网络服务通常提供 WSDL您可以从中自动创建客户端 stub 。 Web 服务基于 SOAP protocol 。ASP.NE
我已经获得了我需要的所有资源。我将 Web 服务放入应用程序服务环境中,然后将 NSG 连接到应用程序服务环境使用的子网。然后,我允许 VNET 内的应用程序与 Web 服务进行通信,但它无法正常工作
我已经获得了我需要的所有资源。我将 Web 服务放入应用程序服务环境中,然后将 NSG 连接到应用程序服务环境使用的子网。然后,我允许 VNET 内的应用程序与 Web 服务进行通信,但它无法正常工作
我正在使用 stub 将我的网络服务相关测试与实际网络服务隔离开来。 你/我应该如何合并测试以确保我制作的响应与实际的网络服务匹配(我无法控制它)? 我不想知道怎么做,而是何时何地? 我应该为测试数据
我在互联网上搜索了很多,但我仍然没有得到网络服务和网络 API 之间的明显区别?我在某处读到所有 Web 服务都是 API,但所有 API 都不是 Web 服务。如何? 我所知道的是两者都允许利用其他
假设我已经完成了使用 JavaEE 制作的 Web 应用程序。这个 Web 应用程序包含登录系统,但最后它是非常基本的 Web 应用程序。我使用的是 GlassFish 3.1.2.2。 我想知道一旦
我希望设计者能够打开与我相同的解决方案文件。这可以通过 Expressions Web 实现吗? 最佳答案 简短的回答是“不”;但这是一个非常常见的请求,我知道很多人都希望下一个版本(无论何时)对此有
我正在尝试在 CF10 中创建一个 Web 服务对象。我已验证它在 SoapUI 中按预期工作。但是,当我在 CF 中运行它时,我得到一个错误,它无法找到在 WSDL 的导入语句中导入的 XSD。这是
我的要求是开发一个 Web 服务,充当外部 Web 服务和客户端之间的中间人。 我知道,我可以为我的服务设计一个wsdl,然后将外部wsdl映射到代码中我的wsdl。我的问题是有一个开源 api/工具
我是一名优秀的程序员,十分优秀!