如何在AWS ECS上部署MySQL Docker映像?

时间:2019-09-04 21:15:10

标签: mysql amazon-web-services docker amazon-ecs aws-fargate

我无法在 AWS ECS FARGATE 上部署 MySQL 映像。

我拥有的cloudformation脚本是这个(不要介意语法,我正在使用python lib Troposphere 来管理cloudfromation模板):

    TaskDefinition(
            'WordpressDatabaseTaskDefinition',
            RequiresCompatibilities=['FARGATE'],
            Cpu='512',
            Memory='2048',
            NetworkMode='awsvpc',   
            ContainerDefinitions=[
                ContainerDefinition(
                    Name='WordpressDatabaseContainer',
                    Image='mysql:5.7',
                    Environment=[
                        Environment(Name='MYSQL_ROOT_PASSWORD', Value='root'),
                        Environment(Name='MYSQL_DATABASE', Value='wpdb'),
                        Environment(Name='MYSQL_USER', Value='root'),
                        Environment(Name='MYSQL_PASSWORD', Value='root'),
                    ],
                    PortMappings=[
                        PortMapping(
                            ContainerPort=3306
                        )
                    ]
                )
            ]
        )

部署成功。我什至可以看到任务运行了几秒钟,直到其状态变为已停止

我唯一能看到的是:

  1. 停止原因任务中的基本容器已退出
  2. 退出代码1

在localhost上,它像一个超级按钮一样工作。我在这里做什么错了?至少-有什么方法可以调试吗?

2 个答案:

答案 0 :(得分:1)

对于AWS ECS,如果正在停止,则可能无法通过运行状况检查,从而导致容器重新启动。容器DB映射到哪个端口,您可以检查容器日志以了解启动后停止时发生了什么吗?另外,请检查服务或任务下ECS中的日志。张贴在这里,以便我看看它们。

答案 1 :(得分:0)

所以,我发现了一个错误。

您要做的第一件事-是在本地主机上测试docker容器,看看是否可以重现该问题。就我而言,环境完全相同的本地计算机上的docker mysql容器也崩溃了。我能够检查日志,发现它无法创建“ root”用户。只需更改用户名和密码,就可以在ECS上正常工作。

这是在 AWS ECS FARGATE

上运行mysql docker映像的完整堆栈:
    self.wordpress_database_task = TaskDefinition(
            'WordpressDatabaseTaskDefinition',
            RequiresCompatibilities=['FARGATE'],
            Cpu='512',
            Memory='2048',
            NetworkMode='awsvpc',

            # If your tasks are using the Fargate launch type, the host and sourcePath parameters are not supported.
            Volumes=[
                Volume(
                    Name='MySqlVolume',
                    DockerVolumeConfiguration=DockerVolumeConfiguration(
                        Scope='shared',
                        Autoprovision=True
                    )
                )
            ],

            ContainerDefinitions=[
                ContainerDefinition(
                    Name='WordpressDatabaseContainer',
                    Image='mysql:5.7',
                    Environment=[
                        Environment(Name='MYSQL_ROOT_PASSWORD', Value='root'),
                        Environment(Name='MYSQL_DATABASE', Value='wpdb'),
                        Environment(Name='MYSQL_USER', Value='wordpressuser'),
                        Environment(Name='MYSQL_PASSWORD', Value='wordpressuserpassword'),
                    ],
                    PortMappings=[
                        PortMapping(
                            ContainerPort=3306
                        )
                    ]
                )
            ]
        )

        self.wordpress_database_service = Service(
            'WordpressDatabaseService',
            Cluster=Ref(self.ecs_cluster),
            DesiredCount=1,
            TaskDefinition=Ref(self.wordpress_database_task),
            LaunchType='FARGATE',
            NetworkConfiguration=NetworkConfiguration(
                AwsvpcConfiguration=AwsvpcConfiguration(
                    Subnets=[Ref(sub) for sub in VpcFormation().public_subnets],
                    AssignPublicIp='ENABLED',
                    SecurityGroups=[Ref(self.security_group)]
                )
            ),
        )

请注意 AssignPublicIp ='ENABLED' 选项,这样您就可以远程连接到数据库。

完成堆栈后,我可以使用以下命令成功连接:

mysql -uwordpressuser -pwordpressuserpassword -h18.202.31.123

就这样:)