在 CloudFormation 文件中使用 apt-get 安装包
Installing packages using apt-get in CloudFormation file
我有以下 CloudFormation 脚本。正在创建堆栈并启动 Ec2 实例,我可以通过 SSH 登录,但它没有安装包。
我不确定它在哪里失败了。我正在使用 Ubuntu。我找不到我的实例上是否安装了 cfn-init?还是只为 Amazon Linux AMI 安装?
我该如何解决这个问题?
{
"Parameters" : {
"ShinyKey": {
"Description": "Key pair for instance.",
"Type": "AWS::EC2::KeyPair::KeyName"
}
},
"Resources": {
"Ec2Instance" : {
"Metadata": {
"AWS::CloudFormation::Init": {
"config": {
"packages": {
"apt": {
"r-base-dev": [],
"libcurl4-openssl-dev": [],
"git": []
}
}
}
}
},
"Type" : "AWS::EC2::Instance",
"Properties": {
"ImageId": "ami-9eaa1cf6",
"InstanceType": "t2.micro",
"KeyName": {"Ref": "ShinyKey"},
"SecurityGroups": [{"Ref": "InstanceSecurityGroup"}],
"Tags": [{
"Key": "Name",
"Value": "R-Shiny-Server"
}],
"UserData": {
"Fn::Base64": {
"Fn::Join": [
"",
[
"#!/bin/bash\n",
"/usr/local/bin/cfn-init --region ",
{
"Ref": "AWS::Region"
},
" -s ",
{
"Ref": "AWS::StackName"
},
" -r Ec2Instance\n"
]
]
}
}
}
},
"InstanceSecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties": {
"GroupDescription" : "Enable SSH access via port 22, and ports 3838 and 80 for Shiny",
"SecurityGroupIngress" : [
{ "IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : "0.0.0.0/0" },
{ "IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0" },
{ "IpProtocol" : "tcp", "FromPort" : "3838", "ToPort" : "3838", "CidrIp" : "0.0.0.0/0" }
]
}
}
}
}
您需要在实例的元数据 属性 中包含 Cloudformation Init attribute。 cfn-init 脚本使用此元数据来确定引导时应采取的操作。
虽然在您的示例代码中,您似乎甚至没有尝试安装任何包,所以我不确定您希望出现什么包。
上面模板的问题是 cfn-init
没有安装在 Ubuntu AMI 中,因此在您的用户数据脚本中调用 cfn-init
将 return "command not found"什么也不做。
cfn-helper 实用程序仅自动安装在最新的 Amazon Linux AMI 中,如 documentation 中所述。对于 Ubuntu,您需要手动安装它们,您可以在现有的用户数据脚本中添加一行,在 "#!/bin/bash\n",
:
之后
"apt-get update && apt-get install pip && pip install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
在此之后,下一行中对 /usr/local/bin/cfn-init
的调用应该 运行 正确。
我有以下 CloudFormation 脚本。正在创建堆栈并启动 Ec2 实例,我可以通过 SSH 登录,但它没有安装包。
我不确定它在哪里失败了。我正在使用 Ubuntu。我找不到我的实例上是否安装了 cfn-init?还是只为 Amazon Linux AMI 安装?
我该如何解决这个问题?
{
"Parameters" : {
"ShinyKey": {
"Description": "Key pair for instance.",
"Type": "AWS::EC2::KeyPair::KeyName"
}
},
"Resources": {
"Ec2Instance" : {
"Metadata": {
"AWS::CloudFormation::Init": {
"config": {
"packages": {
"apt": {
"r-base-dev": [],
"libcurl4-openssl-dev": [],
"git": []
}
}
}
}
},
"Type" : "AWS::EC2::Instance",
"Properties": {
"ImageId": "ami-9eaa1cf6",
"InstanceType": "t2.micro",
"KeyName": {"Ref": "ShinyKey"},
"SecurityGroups": [{"Ref": "InstanceSecurityGroup"}],
"Tags": [{
"Key": "Name",
"Value": "R-Shiny-Server"
}],
"UserData": {
"Fn::Base64": {
"Fn::Join": [
"",
[
"#!/bin/bash\n",
"/usr/local/bin/cfn-init --region ",
{
"Ref": "AWS::Region"
},
" -s ",
{
"Ref": "AWS::StackName"
},
" -r Ec2Instance\n"
]
]
}
}
}
},
"InstanceSecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties": {
"GroupDescription" : "Enable SSH access via port 22, and ports 3838 and 80 for Shiny",
"SecurityGroupIngress" : [
{ "IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : "0.0.0.0/0" },
{ "IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0" },
{ "IpProtocol" : "tcp", "FromPort" : "3838", "ToPort" : "3838", "CidrIp" : "0.0.0.0/0" }
]
}
}
}
}
您需要在实例的元数据 属性 中包含 Cloudformation Init attribute。 cfn-init 脚本使用此元数据来确定引导时应采取的操作。
虽然在您的示例代码中,您似乎甚至没有尝试安装任何包,所以我不确定您希望出现什么包。
上面模板的问题是 cfn-init
没有安装在 Ubuntu AMI 中,因此在您的用户数据脚本中调用 cfn-init
将 return "command not found"什么也不做。
cfn-helper 实用程序仅自动安装在最新的 Amazon Linux AMI 中,如 documentation 中所述。对于 Ubuntu,您需要手动安装它们,您可以在现有的用户数据脚本中添加一行,在 "#!/bin/bash\n",
:
"apt-get update && apt-get install pip && pip install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
在此之后,下一行中对 /usr/local/bin/cfn-init
的调用应该 运行 正确。