我将Heroku视为理所当然,并花了一个月的时间建立自己的基础设施,现在我知道它为我带来了多少收益。
我过去的许多工作都是与基础设施相邻的。我经常发现自己在Build&Integration角色中工作-这个人要不断地进行整合并保持其持续进行,而不是丢在一边。我刚刚建立了一组服务,所以核心基础结构已经在那里,或者我一直在瞄准Heroku之类的东西,您基本上可以从中选择毒药,git push和bob的叔叔。
这次,我将使用AWS工具包将各个部分放在一起。为了将所有部分都放在一起,我使用了Terraform,因为如果我要手写YAML或JSON并祈祷其格式正确,那会非常麻烦。除了GWS之外,我还需要整理更多的AWS。
我现在不想谈论AWS,它使我想起了Foundation和Cocoa的学习-您可以看一看,它可以做很多事情,然后您必须将所有这些单独的,复杂而又复杂的部分放在一起,以做更多的事情我认为,如果我花费大量时间阅读文档,学习其中的全部内容并被尖尖的东西刺伤,那么最终一切都会好起来的。
如果没有,通常它会以一种有用的方式失败,然后我可以对其进行修复,然后重试。
Terraform:“启动和运行”非常出色,Terragrunt使其更加容易。非常感谢他们的团队提供了我们所需的胶带。 🙌
根据我的经验,terraform-lsp应该提供自动完成功能,但大多数情况下不提供。首先,它打开盖子,我敢于在其中包含多个根模块的仓库,所以我只是将VS Code对准了具有单个根模块的文件夹。然后,语言服务器说这都是笨拙的AFAICT,但是除了裸语言语法外,它不会自动完成任何操作。结果,我要手动引用文档并写下来的东西,浪费大量时间,因为自动完成和集成棉绒之类的工具应该可以使我免于遭受损失。
状态文件包含纯文本机密。 (您可能会喜欢有关纯文本秘密问题的已有六年历史的GitHub问题。)您可以将输出标记为秘密,因此在应用基础设施规范时不会输出它们,而是运行terraform show而不是terraform apply ,就在那里,凝视着你。至少您可以锁定并加密保存状态的S3存储桶。 Pulumi的秘密管理要令人满意得多。但是Pulumi比v0还要先进。无论Terraform是什么,我都希望Hashicorp能够使TF运行一段时间,而我对Pulumi不太自信,所以我正在使用TF。 (Hashicorp当然会推荐保险柜。)
关于您如何以稍微不同的方式声明和引用事物的语言中令人讨厌的不对称性-作为初学者,我一遍又一遍地遍历这些不对称性:您在locals块中声明了locals,但是将它们引用为local.thing,而不是locals.thing 。
您将数据源声明为数据“ provider_thingy”“ my_name_for_this_data”,然后必须将其作为data.provider_thingy.my_name_for_this_data进行访问。 (至少这实际上是相当一致的。尽管如此,为什么提供商周围的引号很麻烦?)
您将资源声明为资源“ provider_thingy”“ my_name”。但是您不能将它们引用为resource.provider_thingy.my_name。不,您只需将它们引用为裸provider_thingy.my_name。
就此而言,还有其他奇怪之处。看起来好像应该正交的语法不是。 for_each在这里脱颖而出:您可以通过在块中放置for_each来生成多个资源:资源“ provider_thing”“ mine” {}变为资源“ provider_thing”“ mine” {for_each = of_these}
但是嵌套的参数块需要从类似的设置{namespace =“ blah”}转换为动态的“ setting” {for_each = somethingy;内容{名称空间=“ blah”}}。开心地看了几次。
而且,甚至无法在模块导入中使用for_each技巧。只是不支持。抱歉,很遗憾成为你。
文档中令人讨厌的差距:必需参数和可选参数的区别不是很清楚,也根本没有隔离。因此,您可以玩“声明此资源的最小框架是什么”的游戏。实际上,要运行几次以查看所要解决的问题要比仅仅查看文档和使之困惑的时间要长,这是因为在红外中的迭代时间很长(请参见下文)。
类型未显示在文档中!!!输入所有输出和参数。您必须声明这些类型。在代码中。但是文档没有说明任何类型。您只是在运行时遇到类型错误。好玩好玩!
HCL语言是通过CLI工具记录的,而不是其本身。实际上很难找到文档,因为当我遇到语法问题时,首先想到的不是“让我们看看该工具的文档”。当您对C语法有疑问时,就好像要拉起GCC的手册页(先仔细画出三角形)。
AWS提供程序中令人讨厌的不对称性:缺少链接:有时您会遇到“无法从此处到达”的情况。就像尝试为Elastic Beanstalk环境的CNAME查找区域ID一样,您可以将Route 53别名作为目标。 (提示,您需要一个完全不同的资源aws_elastic_beanstalk_hosted_zone。)
命名不规则:有时候您可以通过arn,id或名称来钓鱼,祝您好运。将文档放在手边。
(这很有可能是从AWS API本身继承的,但是抽象层的全部目的是使事情变得更好,更有用,dangit。)
迭代时间远比移动应用程序长。例如,“您有可能在等待查看计划输出时进行任务切换”。
测试是痛苦的。我还没有参加Terratest,因为在我之后坚持进行此操作的任何人都不太可能有Go的经验,而且我的关注点不是建立可重复使用的基础结构-它正在构建基础结构-因此,我一直在使用蝙蝠和Bash壳脚本(使用shellcheck,这非常了不起),用于使用AWS CLI进行事后完整性检查。 (专家提示:使用社区维护的fork bats-core,而不是不再维护的sstephenson原作。)策略断言感觉像是一种不同的测试风格,但是这里的工具似乎还很不成熟,也许除了如果您定位Kubernetes。
我希望我会在接下来的一个月中习惯语法的大部分粗糙之处。而且Terraform是stil v0,所以,嘿,也许一些重大更改将清除所有这些混乱。 🤞
我刻意不只是现在就沉迷于文档沮丧的黑客活动。甚至是关于使所有Terragrunt logspew静音的非常诱人的公开问题。
我确实计划花费一些时间,至少从语言服务器上尝试对资源和数据源类型及其参数/属性进行自动完成。那将是巨大的帮助。
运行命令并拥有基础设施……这仍然感觉很神奇,您会碰上回车,稍等片刻,然后服务器开始服务,域出现别名,整个系统群都在互操作。这让我想起了魔术带有blinkenlights的家庭自动化系统,而不会给您带来任何麻烦的“硬件”东西。