Amazon web services 如何在CloudFormation模板中将数据从AWS S3复制到EC2?

Amazon web services 如何在CloudFormation模板中将数据从AWS S3复制到EC2?,amazon-web-services,amazon-s3,amazon-ec2,amazon-cloudformation,Amazon Web Services,Amazon S3,Amazon Ec2,Amazon Cloudformation,我创建了一个CloudFormation模板,用于启动自动缩放组。在启动期间,允许s3:GetObject访问的策略附加到每个EC2实例。在此之后,我使用用户数据安装ApacheWeb服务器和PHP,然后更改相关文件夹的设置。然后,我需要将多个文件从一个S3存储桶(没有公共访问权限)复制到每个实例中的/var/www/html文件夹中,但如果不在CloudFormation堆栈完成后恢复到手动复制或与CLI同步文件,我就无法解决这一问题—这必须是一个完全自动化的过程 模板中的用户数据如下所示:

我创建了一个CloudFormation模板,用于启动自动缩放组。在启动期间,允许
s3:GetObject
访问的策略附加到每个EC2实例。在此之后,我使用用户数据安装ApacheWeb服务器和PHP,然后更改相关文件夹的设置。然后,我需要将多个文件从一个S3存储桶(没有公共访问权限)复制到每个实例中的/var/www/html文件夹中,但如果不在CloudFormation堆栈完成后恢复到手动复制或与CLI同步文件,我就无法解决这一问题—这必须是一个完全自动化的过程

模板中的用户数据如下所示:

"UserData": {
    "Fn::Base64": {
        "Fn::Join": [
            "\n",
            [
                "#!/bin/bash",
                "yum update -y",
                "yum install -y httpd24 php56",
                "service httpd start",
                "chkconfig httpd on",
                "groupadd DMO",
                "usermod -a -G DMO ec2-user",
                "chgrp -R DMO /var/www",
                "chmod 2775 /var/www",
                "find /var/www -type d -exec chmod 2775 {} +",
                "find /var/www -type f -exec chmod 0664 {} +"
            ]
        ]
    }
}

要坚持您已经在做的操作,您可以从userdata脚本中运行AWS CLI:

"UserData": {
    "Fn::Base64": {
        "Fn::Join": [
            "\n",
            [
                "#!/bin/bash",
                "yum update -y",
                "yum install -y httpd24 php56",
                "service httpd start",
                "chkconfig httpd on",
                "groupadd DMO",
                "usermod -a -G DMO ec2-user",
                "chgrp -R DMO /var/www",
                "chmod 2775 /var/www",
                "aws s3 cp s3://MYBUCKET/MYFILE.zip /tmp",
                "unzip -d /var/www /tmp/MYFILE.zip",
                "rm /tmp/MYFILE.zip",
                "find /var/www -type d -exec chmod 2775 {} +",
                "find /var/www -type f -exec chmod 0664 {} +"
            ]
        ]
    }
}
为此,EC2实例概要文件必须授予从S3读取文件的权限

另一种方法是使用:它是一个预定义的元数据键,可以附加到
EC2::Instance
AutoScaling::LaunchConfiguration
资源,允许您配置包、服务和单个文件(包括从S3检索和解压缩文件)


有一个教程

,您可以在userdata脚本中运行AWS CLI:

"UserData": {
    "Fn::Base64": {
        "Fn::Join": [
            "\n",
            [
                "#!/bin/bash",
                "yum update -y",
                "yum install -y httpd24 php56",
                "service httpd start",
                "chkconfig httpd on",
                "groupadd DMO",
                "usermod -a -G DMO ec2-user",
                "chgrp -R DMO /var/www",
                "chmod 2775 /var/www",
                "aws s3 cp s3://MYBUCKET/MYFILE.zip /tmp",
                "unzip -d /var/www /tmp/MYFILE.zip",
                "rm /tmp/MYFILE.zip",
                "find /var/www -type d -exec chmod 2775 {} +",
                "find /var/www -type f -exec chmod 0664 {} +"
            ]
        ]
    }
}
为此,EC2实例概要文件必须授予从S3读取文件的权限

另一种方法是使用:它是一个预定义的元数据键,可以附加到
EC2::Instance
AutoScaling::LaunchConfiguration
资源,允许您配置包、服务和单个文件(包括从S3检索和解压缩文件)


<>有一个教程

考虑考虑精彩!我不知道默认情况下CLI安装在EC2服务上(但我想这取决于正在使用的AMI)。@DorianFabre-是的,它只默认安装在AWS Linux AMI上,但对于其他用户,您只需在用户数据中执行
pip安装awscli
(或
pip3
)即可。太棒了!我不知道默认情况下CLI安装在EC2服务上(但我想这取决于正在使用的AMI)。@DorianFabre-true,它仅默认安装在AWS Linux AMI上,但对于其他用户,您可以将
pip安装awscli
(或
pip3
)作为用户数据的一部分。