CloudFormation是一个功能强大的AWS产品,它允许程序创建AWS资源堆栈,如的应用程序的Web层,一个高性能计算集群,或整个应用程序堆栈,用一个单一的API调用.它非常强大.使用它肯定被认为是一种很好的AWS实践,特别是当它与Chef, Puppet或cloud-init结合使用时.调试它让我感到恶心.
举一个生产示例:股票mongodb集群模板对我不起作用.我不知道为什么.我确信这很简单,因为它几乎总是如此.我的问题不在于我无法弄清楚出了什么问题.这就是它需要20到30分钟的堆栈才能失败,然后再删除三到四分钟,假设它完全正确地删除了资源.
我错过了什么?我知道--disable-rollback旗帜并像氧气一样使用它.我很久以前就学会了将退出信息包起来cfn-signal并将它们像一艘正在下沉的船上的压舱物一样扔掉.如何更快地完成模板调试过程,或者在我制作它们半小时后我是否永远注意到我的错误?
假设我编写了以下代码片段.这里的操场上的完整代码适合那些倾向的人.
type Book struct {
Title string
Author string
}
func main() {
ms := Book{"Catch-22", "Joseph Heller"}
out, err := json.MarshalIndent(ms, "", " ")
if err != nil {
log.Fatalln(err)
}
fmt.Println(string(out))
}
Run Code Online (Sandbox Code Playgroud)
此代码完全按照我的预期输出以下内容:
{
"Title": "Catch-22",
"Author": "Joseph Heller"
}
Run Code Online (Sandbox Code Playgroud)
假设我想在JSON输出中添加一个字段而不将其包含在Book结构中.也许是一种类型:
{
"Title": "Catch-22",
"Author": "Joseph Heller",
"Genre": "Satire"
}
Run Code Online (Sandbox Code Playgroud)
我可以使用MarshalJSON()向JSON有效负载添加任意字段Marshal()吗?就像是:
func (b *Book) MarshalJSON() ([]byte, error) {
// some code
}
Run Code Online (Sandbox Code Playgroud)
其他答案让我觉得这应该是可能的,但我正在努力弄清楚实现.
我正在使用CloudFormation来管理Tomcat Web服务器堆栈,但我厌倦了为新的应用程序版本进行原始AMI管理.我想向厨师方向走,但现在没有时间.相反,我试图在网络服务器实例化中克服一个简单的问题:当新机器启动时,如何下载"当前"WAR?
我的想法是利用私有的S3存储桶和cloudinit,但我对IAM凭据的处理方式感到有点困惑.我可以将它们放在模板的用户数据中,但我不愿意这样做,特别是因为我是控制该文件的版本.我能想到的唯一选择是在AMI本身中使用环境变量.它们必须是纯文本,但是......呃,如果你可以打破我的实例,你可以压缩并下载我的整个网络服务器.只要IAM用户不被重复用于任何其他用户并且定期轮换,这似乎是解决问题的合理方法.我错过了什么吗?如何使用cloudinit安全地下载私有S3资产?
我正在构建一个需要访问私有S3存储桶的堆栈,以下载我应用程序的最新版本.我正在使用IAM角色,这是一个相对较新的AWS功能,允许为EC2实例分配特定角色,然后将其与IAM策略结合使用.不幸的是,这些角色带有在实例化时生成的临时API凭证.它并没有瘫痪,但它迫使我做像这样的cloud-init脚本(简化为相关位):
#!/bin/sh
# Grab our credentials from the meta-data and parse the response
CREDENTIALS=$(curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access)
S3_ACCESS_KEY=$(echo $CREDENTIALS | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['AccessKeyId'];")
S3_SECRET_KEY=$(echo $CREDENTIALS | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['SecretAccessKey'];")
S3_TOKEN=$(echo $CREDENTIALS | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['Token'];")
# Create an executable script to pull the file
cat << EOF > /tmp/pullS3.rb
require 'rubygems'
require 'aws-sdk'
AWS.config(
:access_key_id => "$S3_ACCESS_KEY",
:secret_access_key => "$S3_SECRET_KEY",
:session_token => "$S3_TOKEN")
s3 …Run Code Online (Sandbox Code Playgroud) amazon-ec2 amazon-web-services cloud-init aws-cloudformation amazon-iam
我们正在运行一个中央git存储库(gforge),每个人都会从中推出并推送.不幸的是,一些无能的同事已经决定将几个10-100Mb jar文件推入回购中是一个好主意.因此,我们使用的服务器已经耗尽了磁盘空间.
我们才意识到这一点,为时已晚,而且大多数人已经撤回了新的大型回购.如果没有推出问题,那么我们可以做一个rebase来剪掉那些巨大的提交并修复它,但是现在每个人都已经从中撤出了,删除该提交的最佳方法是什么(或者做一个rebase to just删除大文件)当每个人都想从/向回购/推送/推送时,这不会导致混乱?
它应该是脚本的小型回购,但现在大小约为700M :-(
是否可以将冲突标记更改为用户定义的内容?
动机:
我已经多次发生过这样的事情,由于仓促而且没有非常仔细地合并几个分支,我的LaTeX文档中还有一些剩余的合并标签.对于大多数编程项目,这些标签会导致语法错误,因此我会发现它们.但是,在Latex中,<<<<,====和>>>>标签只是编译成其他一些字符序列而没有任何警告.
为了解决这个问题,我想将这些冲突标记更改为无法编译的内容,或者至少使它们非常明显(例如分页符,大字体警告或编译警告).
我当然可以制作一个(bash)脚本,用我选择的东西替换所有这些标记,但我更希望它能更优雅地解决这个问题.
PS我发现了merge.conflictstyle选项,但是diff3选项只添加了|||| 标记,它也编译而没有警告.
我正在尝试使用AWS文档提供的示例请求和示例函数为Amazon Glacier上传请求生成签名,但我无法使其正常工作.在这一点上,我确信我错过了一些非常明显的东西:
#!/bin/env python
import hmac
import hashlib
# This string to sign taken from: http://docs.amazonwebservices.com/amazonglacier/latest/dev/amazon-glacier-signing-requests.html#example-signature-calculation
sts = """AWS4-HMAC-SHA256
20120525T002453Z
20120525/us-east-1/glacier/aws4_request
5f1da1a2d0feb614dd03d71e87928b8e449ac87614479332aced3a701f916743"""
# These two functions taken from: http://docs.amazonwebservices.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-python
def sign(key, msg):
return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).hexdigest()
# The fake secret key is provided by the referenced docs
def getSignatureKey():
kDate = sign(("AWS4" + "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY").encode('utf-8'), "20120525")
kRegion = sign(kDate, "us-east-1")
kService = sign(kRegion, "glacier")
kSigning = sign(kService, "aws4_request")
return kSigning
signature = sign(getSignatureKey(), sts)
print signature
Run Code Online (Sandbox Code Playgroud)
如果我运行我的程序,我得到以下哈希: …
我经常发现自己在开发过程中做了类似的事情:
:e <file>
:vsplit <the_same_file> "reopen/re-edit with a vertical split
Run Code Online (Sandbox Code Playgroud)
正如一些响应者指出的那样,有一个更好的方法::vs<CR>.假设有一刻没有.
如果我在shell中打开文件,我会使用!$历史记录扩展来捕获上一个命令的最后一个参数,如下所示:
$ echo "Hello" "stackoverflow"
Hello stackoverflow
$ echo "I'm posting on !$"
I'm posting on stackoverflow
Run Code Online (Sandbox Code Playgroud)
这种扩展以及许多其他类似的扩展彻底重新定义了我使用命令行的方式.vim中有等价物吗?我知道%当前文件的别名.过去命令参数怎么样?
我在MacOSX上运行python版本2.7.3.
考虑这段代码:
from __future__ import print_function
import time
x = 0
while x < 5:
print(x)
x += 1
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
如果我运行这个脚本,我会观察到我期望的输出:数字0通过附加到每个数字4的\n字符.此外,每暂停一秒后显示每个数字.
0
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
现在考虑这个代码块:
from __future__ import print_function
import time
x = 0
while x < 5:
print(x, end='')
x += 1
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
输出是我所期望的,01234没有\n's,但时间是出乎意料的.该过程不是在一秒钟暂停后显示每个数字,而是等待四秒钟,然后显示所有五个数字.
为什么print('string')表现与print('string', end='')while循环不同?有没有办法显示没有换行符的字符,一次一秒?我尝试过sys.stdout.write(str(x)),但它的行为方式与之相同print(end='').
我在requests模块的源头四处寻找,并注意到这段代码:
class Response(object):
"""The :class:`Response <Response>` object, which contains a
server's response to an HTTP request.
"""
def __init__(self):
super(Response, self).__init__()
... more init method...
Run Code Online (Sandbox Code Playgroud)
我的理解super()表明这个电话根本不会做任何事情.我发现相当的几个问题,关于超通话,但其他类的子类,但并非所有的工作object本身.在python文档,也没有提及这种结构.
在我看来,这可能只是一个错误,如果您git blame将该文件提交给引入该行的提交,您将看到在作者身份时,它Response是一个子类BaseResponse.该行只是一个类重构的延续,还是这个super()调用做了什么呢?
python ×3
cloud-init ×2
git ×2
amazon-ec2 ×1
amazon-iam ×1
amazon-s3 ×1
bash ×1
git-merge ×1
go ×1
hmac ×1
inheritance ×1
json ×1
latex ×1
merge ×1
sh ×1
super ×1
vim ×1
while-loop ×1