aws beanstalk 使用docker平台部署beanstalk应用程序
参考资料
之前的文章分享过如何使用eb cli工具创建application和eb环境,本文介绍beanstalk支持的docker容器部署
关于beanstalk环境创建相关的资源和部署逻辑,参考之前的文章《aws beanstalk 使用eb cli配置和启动环境》
$ eb init
Select a platform branch.
1) Docker running on 64bit Amazon Linux 2
2) ECS running on 64bit Amazon Linux 2
$ eb create
# 扩容实例
$ eb scale 1 test-beandocker-env
 
beanstalk的docker平台支持两个分支
- 在 64AL2 上运行的 Docker
 - 在 64AL2 上运行的 ECS
 
可以使用Dockerfile启动docker环境
如果使用的是 docker compose,eb会使用
docker-compose.yml文件来提取和运行您的映像否则eb会改用
Dockerrun.aws.json,可以理解为aws的docker-compose
使用eb cli过程中几个好用的命令
# 登录实例
$ eb ssh
Select an instance to ssh into
1) i-09xxxxxxxe1c7
2) i-09xxxxxx08d18
# 下载当前应用zip
$ eb labs download
Downloading application version...
Application version downloaded to: /home/ec2-user/xxxxxx
# 生成cw logs配置到.ebextension文件夹下
$ eb labs setup-cloudwatchlogs
# 在本地运行测试容器,实际就是使用docker-compose
$ eb local run --port 5000
# 注意:使用以上命令无法启动ecs托管环境的应用
# ERROR: NotFoundError - The EB CLI cannot find Dockerfile or the Dockerrun.aws.json file in the application root directory
 
关于eb的部署权限和实例配置文件
在使用 Elastic Beanstalk 控制台或 EB CLI 启动环境时,Elastic Beanstalk 创建一个名为
aws-elasticbeanstalk-ec2-role的默认实例配置文件,并为其分配具有默认权限的托管式策略所有 Amazon Linux 2 平台版本都会在环境创建期间默认启用增强型运行状况。实例需要正确权限来收集和报告增强型运行状况信息
eb提供了三种托管策略
- AWSElasticBeanstalkWebTier,上传日志到s3和调试信息到xray
 - AWSElasticBeanstalkWorkerTier :日志上传、调试、指标发布和工作程序实例任务
 - AWSElasticBeanstalkMulticontainerDocker :ecs相关权限,附加在ecs实例上
 - (可选)AmazonSSMManagedInstanceCore:ssm托管
 
docker环境的beanstalk
docker环境的部署文件支持
Dockerrun.aws.json- docker-compose.yml
 - dockerfile
 
支持本地测试
eb local run --port 5000
 
使用dockerfile部署,将Dockerfile和application.py文件复制到项目根目录
$ cat Dockerfile
FROM python:3.6
COPY . /app
WORKDIR /app
RUN pip install Flask==1.0.2
EXPOSE 5000
CMD ["python", "application.py"]
$ cat application.py
from flask import Flask
# Print a nice greeting
def say_hello(username = "World"):
    return '<p>Hello %s!</p>\n' % username
# Some bits of text for the page
header_text = '''
    <html>\n<head> <title>EB Flask Test</title> </head>\n<body>'''
instructions = '''
    <p><em>Hint</em>: This is a RESTful web service! Append a username
    to the URL (for example: <code>/Thelonious</code>) to say hello to
    someone specific.</p>\n'''
home_link = '<p><a href="/">Back</a></p>\n'
footer_text = '</body>\n</html>'
# Elastic Beanstalk looks for an 'application' that is callable by default
application = Flask(__name__)
# Add a rule for the index page
application.add_url_rule('/', 'index', (lambda: header_text +
    say_hello() + instructions + footer_text))
# Add a rule when the page is accessed with a name appended to the site
# URL
application.add_url_rule('/<username>', 'hello', (lambda username:
    header_text + say_hello(username) + home_link + footer_text))
# Run the application
if __name__ == "__main__":
    # Setting debug to True enables debug output. This line should be
    # removed before deploying a production application.
    application.debug = True
    application.run(host="0.0.0.0")
$ eb deploy
 
使用docker-compose.yml文件部署,将docker-compose.yml文件复制到项目根目录,创建新的service使用ecr的远程镜像
注意:需要提前安装docker-compose,ec2实例需要去往ecr拉取镜像的权限
$ cat docker-compose.yml
version: '3.8'
services:
  beanstalk-flask:
    image: "xxxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/beanstalk-flask"
    ports:
      - "80:5000"
$ eb deploy
 
使用Dockerrun.aws.json文件(v1单容器版本)部署
$ cat Dockerrun.aws.json
{
  "AWSEBDockerrunVersion": "1",
  "Image": {
    "Name": "username/beanstalk-flask",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": "5000"
    }
  ]
}
$ eb deploy
 
此外使用v1单容器的Dockerrun.aws.json,可以不指定image键,但需要提供dockerfile文件(间接指定image),该构建行为最终会在eb实例上进行
查看托管环境的docker容器
$ sudo usermod -a -G docker $USER
$ sudo docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS      NAMES
65fd847eef7d   59f502b87637   "python application.…"   50 seconds ago   Up 49 seconds   5000/tcp   interesting_robinson
 
对于私有仓库拉取镜像的配置,需要在Dockerrun.aws.json额外添加以下配置,s3文件为~/.docker/config.json文件内容
$ cat Dockerrun.aws.json
{
  "AWSEBDockerrunVersion": "1",
  "Authentication": {
    "Bucket": "DOC-EXAMPLE-BUCKET",
    "Key": "mydockercfg"
  },
 ...
}
 
ecs托管环境的beanstalk
2022 年 7 月 18 日 开始Elastic Beanstalk 将基于 Amazon Linux AMI (AL1) 的所有平台分支的状态设置为已停用
ecs托管环境的部署文件支持
Dockerrun.aws.json文件是特定于eb的部署文件,分为v1和v2版本,v2版本的部署文件增加了多多容器的支持(只支持ecs托管docker环境)。- docker-compose.yml
 - dockerfile(不支持),因此使用的image需要预构建并推送
 
eb托管的ecs环境执行创建集群,任务定义和创建任务(无服务)等操作。为了充分利用odcker环境,eb托管的ec2实例可以并行运行多个eb应用。创建的ecs资源有:集群群,任务定义,任务,容器代理 ,数据卷
ecs环境中的每个实例运行相同的容器组,在Dockerrun.aws.json文件中定义,示例文件如此链接,定义了多容器任务(和ecs任务定义类似)。与 Dockerrun.aws.json 一起存档的源代码将部署到 Amazon EC2 容器实例中,并且可在 /var/app/current/ 目录中进行访问
如果需要拉取私有仓库image需要配置authentication参数,但是镜像存储在ecr中除外(需要为实例配置权限AmazonEC2ContainerRegistryReadOnly)
无法在本地进行测试,报错如下
$ eb local run --port 5000
ERROR: NotSupportedError - You can use "eb local" only with preconfigured, generic and multicontainer Docker platforms.
 
登录实例产看容器
在这里插入图片描述
在ecs控制台上看到单独启动一个任务,没有创建服务
 
除了部署和配置方式不同,其他和ecs任务一致
                    
                
                
            
        
浙公网安备 33010602011771号