当前位置: 首页 > news >正文

【AWS实验 】在 AWS Fargate 上使用 Amazon ECS 部署应用程序

文章目录

    • 实验概览
    • 目标
    • 实验环境
    • 任务 1:连接到实验命令主机
    • 任务 2:将应用程序容器化
    • 任务 3:构建 Web2048 容器
    • 任务 4:创建 Amazon ECR 存储库并推送 Docker 映像
    • 任务 5:创建 ECS 集群
    • 任务 6:测试应用程序
    • 总结

实验概览

某团队正在开发一款在线游戏。乐观地认为该游戏会取得成功,并预计会有成千上万的游戏玩家通过互联网访问这款游戏。希望减少放在基础设施上的精力,更多地关注游戏开发。但不想分配任何前期基础设施资本来部署这款游戏。但是,想确保该应用程序在部署后可以针对用户高峰期进行扩展。

这款在线游戏名为 “Web 2048”,已准备好发布。云架构师建议在 AWS Fargate 上使用 Amazon Elastic Container Service (Amazon ECS)。

在本实验中,您需要将基于 Web 的游戏作为 Docker 容器映像构建,将其推送到 Amazon Elastic Container Registry (Amazon ECR),并创建一个在 AWS Fargate 上运行 Docker 容器的 Amazon ECS 集群。

目标

完成本实验后,将能够:

  • 将容器映像上传到要用于部署 Amazon ECS 的 Amazon ECR 存储库
  • 将容器从存储库部署到 Amazon ECS Fargate 集群
  • 创建 Amazon ECS 服务和任务
  • 在 Amazon ECS Fargate 集群的 Docker 容器中测试并演示基于 Web 的应用程序

实验环境

在本实验中,在实验环境中预置了一个单独的 Amazon Virtual Private Cloud (Amazon VPC),其中包含公有子网、互联网网关、有路由的路由表、Application Load Balancer、安全组、EC2 实例以及 AWS Identity and Access Management (IAM) 角色。

下图显示了为本实验预置的资源:

image-20230903195300352

Amazon Elastic Container Service (Amazon ECS) 是一项高度可扩展的高性能容器管理服务,支持 Docker 容器。它可以帮助您在 Amazon Elastic Compute Cloud (Amazon EC2) 实例托管的集群上轻松运行应用程序。使用 Amazon ECS,您不需要安装、运维和扩展自己的集群管理基础设施。

AWS Fargate 是一种适用于容器的无服务器计算引擎,可与 Amazon ECS 和 Amazon EKS 配合使用。借助 Fargate,您可以专注于构建自己的应用程序。借助 Fargate,您无需预置和管理服务器,而且可以为每个应用程序指定资源并为其付费,还能通过设计隔离应用程序来提高安全性。

注意:在本实验中,所有步骤都需要使用 Linux 终端的 AWS CLI。为了熟悉命令行以开始构建过程,尽量不要复制和粘贴每个步骤中的命令,而是尽可能多地自己键入命令。大多数关于容器的真实场景都使用命令行方法。完成本实验后,应该能够使用这些相同的命令来帮助构建您自己的概念证明。


任务 1:连接到实验命令主机

在此任务中,将连接到运行 Amazon Linux 2 操作系统的 Amazon EC2 实例,然后克隆本实验所需的 2048 GitHub 存储库。

复制实验页面左侧的 CommandHostSessionUrl 的值,并将其粘贴到新的浏览器标签页中,然后按 Enter 键。

https://us-east-2.console.aws.amazon.com/systems-manager/session-manager/i-0910a8d48fc80b8c2?region=us-east-2

命令:运行以下命令,检查 Git 和 Docker 版本并验证安装:

docker -v && git --version

终端应该返回类似于下面的内容。

image-20230903195730861

命令:Git 在运行命令的目录内创建一个目录。使用以下命令确认您当前的工作目录:

pwd

image-20230903195917283

将目录更改为主目录并克隆 Git 存储库。

命令:在终端窗口中,复制并粘贴(或键入)以下命令:

cd ~
git clone https://github.com/gabrielecirulli/2048

命令:列出目录内容以确认存储库已克隆:

ls -l | grep 2048

预期输出

rwxr-xr-x 6 root root 200 Sep  3 12:00 2048

附加信息

  • Docker 是一种命令行实用程序,用于在环境中创建和管理 Docker 容器。
  • Git 是一个分布式的开源版本控制系统 (VCS),它允许您存储代码、跟踪修订历史记录、合并代码更改,并在需要时恢复为早期代码版本。

任务 2:将应用程序容器化

在此任务中,将创建用于在 Amazon ECS 上部署容器的 Dockerfile。容器将软件与其环境隔离开来,尽管存在开发环境与生产环境或云托管与本地托管等差异,仍能确保统一工作。这样做可以大幅提高应用程序的一致性和可移植性。

在命令主机会话中,请确认是否打开了 ssm_user 主目录。

命令:使用以下命令导航到 2048 目录:

cd 2048

使用 heredoc 创建 Dockerfile。heredoc 是 here document 的缩写,这是一种在编程语言中定义多行字符串的方式。它可以创建跨越多行的文本块,而不必使用转义字符来连接多个字符串。

命令:要在此目录中创建 Dockerfile,请运行以下 cat 命令以使用 heredoc:

注意Dockerfile 必须以大写字母开头,并且没有文件扩展名。

cat << EOF > Dockerfile
FROM nginx:latestCOPY . /usr/share/nginx/htmlEXPOSE 80
EOF

Docker 使用此文件构建一个容器映像,将软件打包成标准单元,用于开发、发送和部署。

示例 Dockerfile

FROM nginx:latestCOPY . /usr/share/nginx/htmlEXPOSE 80

思考:查看此 Dockerfile 的组件:

  • FROM 命令定义构建容器的基础映像。您还可以使用 Nginx 等供应商来发布、维护和支持官方供应商容器映像,而不是使用通用的 Linux 发行版。在您的 Dockerfile 中,请注意基础映像是nginx:latest 。Docker 将构建一个基础映像,其中安装了所有 nginx 需求,并使用默认配置,从而无需冗长的 Dockerfile 和耗时的部署。这缩短了安装时间,可以为您节省数千小时,具体取决于执行的部署数量。

  • COPY 命令允许 Docker 将本地文件复制到容器映像中。在本实验中,我们克隆了 2048 Git 存储库,现在正将该存储库的所有内容复制到默认的 nginx 目录中,用 Git 存储库中的 index.html 文件和所有应用程序代码替换 nginx 默认 index.html 页面。任何额外的文件或目录均已位于它们应在的位置,构成适当的目录结构,使应用程序按预期运行。

  • EXPOSE 命令打开容器上的一个端口。创建 Amazon ECS 集群时,您将有机会使用端口转发。此功能可用于混淆非默认端口的使用。在本实验中,我们将同时使用容器中的端口 80 和 AWS Fargate 中的端口 80,由 Application Load Balancer 上的侦听器转发这些端口。


任务 3:构建 Web2048 容器

在此任务中,将在命令主机上构建和测试 Docker 容器。

返回到显示命令主机会话的浏览器标签页。

注意:如果您关闭了堡垒主机浏览器标签页,请参考 “任务 1:连接到命令主机” 部分。

命令:要确认当前的工作目录是 2048 目录,请运行以下命令:

cd ~/2048
ls -l

预期输出

total 32
-rw-r--r-- 1 root root 1970 Sep  3 12:00 CONTRIBUTING.md
-rw-r--r-- 1 root root   59 Sep  3 12:02 Dockerfile
-rw-r--r-- 1 root root 1083 Sep  3 12:00 LICENSE.txt
-rw-r--r-- 1 root root 2280 Sep  3 12:00 README.md
-rw-r--r-- 1 root root  300 Sep  3 12:00 Rakefile
-rw-r--r-- 1 root root 4286 Sep  3 12:00 favicon.ico
-rw-r--r-- 1 root root 3988 Sep  3 12:00 index.html
drwxr-xr-x 2 root root  252 Sep  3 12:00 js
drwxr-xr-x 2 root root  125 Sep  3 12:00 meta
drwxr-xr-x 3 root root   72 Sep  3 12:00 style

Web2048 是一款简单的 2048 游戏,可在 Web 浏览器中运行。

注意:开发人员通常会遇到的一个问题是:在不使用 sudo 的情况下运行 docker命令,会出现 permission denied(权限被拒绝)错误。将用户放置在docker 组中,您就可以在没有 sudo 权限的情况下运行 docker 命令,使本地用户权限与最低权限访问控制保持一致。有一个简单的解决办法,您可以自己试试。

命令:运行以下命令修复此错误:

sudo usermod -aG docker ssm-user
newgrp docker

现在可以使用 sudo 来运行 docker 命令。

命令:首先,检查库存中当前有哪些容器映像(应该一个也没有):

docker images

命令:要为网站构建 Docker 容器,请运行以下命令:[警告:确保在代码块末尾处加上句点 (.)。]

docker build -t web2048 .

预期输出

[root@ip-10-0-0-185 2048]# docker build -t web2048 .
Sending build context to Docker daemon  1.369MB
Step 1/3 : FROM nginx:latest
latest: Pulling from library/nginx
52d2b7f179e3: Pull complete
fd9f026c6310: Pull complete
055fa98b4363: Pull complete
96576293dd29: Pull complete
a7c4092be904: Pull complete
e3b6889c8954: Pull complete
da761d9a302b: Pull complete
Digest: sha256:104c7c5c54f2685f0f46f3be607ce60da7085da3eaa5ad22d3d9f01594295e9c
Status: Downloaded newer image for nginx:latest---> eea7b3dcba7e
Step 2/3 : COPY . /usr/share/nginx/html---> 9a7887c7a397
Step 3/3 : EXPOSE 80---> Running in 1edf79febd20
Removing intermediate container 1edf79febd20---> 096cafd2808b
Successfully built 096cafd2808b
Successfully tagged web2048:latest

构建只需几秒钟即可完成。滚动到终端窗口底部,直到您看到一条表明构建成功的如下类似消息:

Successfully built 096cafd2808b
Successfully tagged web2048:latest

命令:接下来,使用以下命令再次检查映像列表,查看新的容器映像:

docker images

预期输出

[root@ip-10-0-0-185 2048]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
web2048      latest    096cafd2808b   59 seconds ago   188MB
nginx        latest    eea7b3dcba7e   2 weeks ago      187MB

命令:接下来,要查看已经构建了哪些容器(应该没有),请运行以下命令:

docker container ls

命令:现在,您已经构建了 Docker 映像,接着运行以下命令,在命令主机上测试映像:

docker run -d -it -p 80:80 web2048

思考run 命令启动该容器。命令中的 -d 标记以分离模式运行容器。根据设计,当用于运行容器的根进程退出时,容器也会退出分离模式。这样,您可以在容器运行时继续使用终端。命令中的 -p 80:80 参数将命令主机上的 80 端口绑定到 Docker 容器上的 80 端口。

注意:对于交互式进程(如 shell),您必须一起使用 -i -t(通常用作 -it),用于为容器进程分配一个 TTY。这些标记不是本实验必需的;但是它们对排除容器故障非常有用。

[root@ip-10-0-0-185 2048]# docker run -d -it -p 80:80 web2048
e854ba65535e8380affccaef49b398baf9458e0c5a204182a2af0570656b2099

命令:您现在可以通过运行以下命令查看容器:

注意:可以使用键盘上的向上和向下箭头查看以前使用的命令,无需复制和粘贴已经运行的命令。还可以使用history 命令查看在一个会话中运行的所有命令。还可以结合使用 history 命令与 grep 和 pipe out 关键字搜索词。

history | grep container

对于高级用户,可以借助ctrl + r击键来利用递归反向索引搜索。键入您要查找的关键字,按 Enter 键,终端将再次运行该命令。

命令:您可以尝试使用以下命令:

ctrl + r

命令:现在键入要搜索的关键字(即 container)。按 Enter 键。

预期输出

(reverse-i-search)`container': docker container ls# press enter and the "list containers" command runs again.[root@ip-10-0-0-185 ~]# docker container ls
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                               NAMES
e854ba65535e   web2048   "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   amazing_goodall

命令:如果遇到问题,或者不想使用递归搜索,只需键入以下命令:

docker container ls

命令:接下来,通过从 Web 浏览器访问命令主机来测试容器。要获取 EC2 实例的公有 IP 地址,请运行以下命令:

curl http://169.254.169.254/latest/meta-data/public-ipv4 -w "\n"

预期输出

[root@ip-10-0-0-185 ~]# curl http://169.254.169.254/latest/meta-data/public-ipv4 -w "\n"
3.141.202.174

复制输出中的公有 IP 值。

打开一个的浏览器标签页,在其中粘贴您刚刚复制的公有 IP 地址,然后按 Enter 键。

应该能够看到 2048 应用程序。

image-20230903201814600

返回到终端会话

要停止此 Docker 容器,请运行以下命令。可以再次使用 docker container ls 命令,获取容器 ID 和名称。虽然容器 ID 是唯一的,但容器的每个实例化都有一个唯一的规范名称。在运行命令期间,还可以使用 –name 标记命名每个容器。

命令:找到您的容器 ID 并运行以下命令,将 CONTAINER ID 替换为 web2048 容器的容器 ID:

docker stop CONTAINER ID

任务 4:创建 Amazon ECR 存储库并推送 Docker 映像

现在已构建了一个工作容器映像,接下来需要将该映像存储在其他人和资源可以访问的位置。Amazon ECR 是满足该使用案例要求的理想解决方案。使用 AWS CLI,将创建一个 Amazon ECR 存储库,并将刚刚测试过的映像推送到 Amazon ECR 中进行存储。

image-20230903202031644

之前已经创建了 Web2048 Docker 映像。使用 docker images 命令再次查看映像。记下类别名称(即 REPOSITORY、TAG、IMAGE ID、CREATED 和 SIZE),特别是 REPOSITORY。存储库是具有不同版本和名称标签的同一 Docker 映像的逻辑组。到目前为止,存储库名称只能在本地访问。要在共享映像存储库(如 Amazon ECR)中共享容器映像,必须将容器映像与中央映像存储库相关联。

命令:要获取有关所有已创建 Docker 映像的信息,请运行以下命令:

docker images

预期输出

REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
web2048      latest    096cafd2808b   11 minutes ago   188MB
nginx        latest    eea7b3dcba7e   2 weeks ago      187MB

在输出中,IMAGE ID 是一个唯一标识符,可用于引用特定版本的 Docker 映像。也可以通过与映像关联的存储库来引用该映像。

命令:运行aws configure 并将区域变量设置为实验所在的区域。

AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name []: <YOUR_REGION>
Default output format [json]: json

注意:将 <YOUR_REGION> 替换为的所在的区域。

命令:要为 Docker 映像创建 Amazon ECR 存储库,请运行以下命令。

aws ecr create-repository --repository-name web2048

预期输出

[root@ip-10-0-0-185 ~]# aws ecr create-repository --repository-name web2048
{"repository": {"repositoryUri": "654948215222.dkr.ecr.us-east-2.amazonaws.com/web2048","imageScanningConfiguration": {"scanOnPush": false},"encryptionConfiguration": {"encryptionType": "AES256"},"registryId": "654948215222","imageTagMutability": "MUTABLE","repositoryArn": "arn:aws:ecr:us-east-2:654948215222:repository/web2048","repositoryName": "web2048","createdAt": 1693743822.0}
}

命令:运行以下命令,查看刚刚创建的 Amazon ECR 存储库:

aws ecr describe-repositories --query 'repositories[].[repositoryName, repositoryUri]' --output table

预期输出

[root@ip-10-0-0-185 ~]# aws ecr describe-repositories --query 'repositories[].[repositoryName, repositoryUri]' --output table
---------------------------------------------------------------------
|                       DescribeRepositories                        |
+---------+---------------------------------------------------------+
|  web2048|  654948215222.dkr.ecr.us-east-2.amazonaws.com/web2048   |
+---------+---------------------------------------------------------+

稍后需要在本实验中使用该 URI。可以将该 URI 的值设置为一个环境变量,而不是将其复制到文本编辑器或记事本中供以后使用。这样就可以重用该命令而不必查找 URI 值。

命令:要将存储库 URI 的值导出到一个环境变量中,请运行以下命令:

export REPOSITORY_URI=$(aws ecr describe-repositories --query 'repositories[].[repositoryUri]' --output text)
echo ${REPOSITORY_URI}

echo 命令应当显示当前 ECR 存储库 URI。

image-20230903202941062

必须先登录 Amazon ECR,然后才能将 Docker 映像推送到存储库。get-login 命令返回一个有效期为 12 小时的 docker login 令牌。您可以将此命令的输出转发到 shell,以运行 docker login 命令并完成身份验证。

命令:要对 Amazon ECR 进行身份验证,请运行以下命令:

export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)export AWS_REGION=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region')aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com

预期输出

image-20230903203052793

现在,使用 Docker 映像所在的存储库的 URI 标记该映像,并使用 latest 标签表明它是最新构建版本。

命令:运行以下命令:

docker tag web2048:latest ${REPOSITORY_URI}:latest

命令:要验证是否已应用标签,请重新运行 docker images 命令。存储库 URI 会显示在输出中。

docker images

预期输出

image-20230903203214831

使用 docker push 命令,将 Docker 映像推送到存储库。

命令:运行以下命令:

docker push ${REPOSITORY_URI}:latest

预期输出

image-20230903203318234

命令:运行以下命令,查看映像元数据并确认推送成功:

aws ecr describe-images --repository-name web2048

预期输出

image-20230903203407143


任务 5:创建 ECS 集群

在此任务中,将创建一个 Amazon ECS 集群、一个 ECS 集群任务定义,以及一个包含容器部署任务的 ECS 集群服务

Amazon ECS 容器代理将代表您调用 AWS API,因此为了让服务知道代理属于您,它需要 IAM 策略和角色。此 IAM 角色称为任务执行 IAM 角色。在预置作为先决条件的实验资源时,为您创建了任务执行 IAM 角色。如果创建集群的用户具有这些 IAM 权限,则将自动创建该角色。如果没有,则必须手动创建该角色。

命令:运行以下命令,创建 Amazon ECS 集群,并将集群名称 web2048 作为参数传递:

aws ecs create-cluster --cluster-name web2048

预期输出

[root@ip-10-0-0-185 ~]# aws ecs create-cluster --cluster-name web2048
{"cluster": {"status": "ACTIVE","defaultCapacityProviderStrategy": [],"statistics": [],"capacityProviders": [],"tags": [],"clusterName": "web2048","settings": [{"name": "containerInsights","value": "disabled"}],"registeredContainerInstancesCount": 0,"pendingTasksCount": 0,"runningTasksCount": 0,"activeServicesCount": 0,"clusterArn": "arn:aws:ecs:us-east-2:654948215222:cluster/web2048"}
}

在 ECS 集群上运行任务之前,必须先注册任务定义。任务定义是分组在一起的容器的列表。注册新任务定义分为两个部分:一部分是传递到命令行的任务定义文件(这种方式更干净、更容易),另一部分是使用标志和参数值注册新任务的 AWS CLI 命令。本实验使用第一个选项。

命令:创建任务定义文件。导航到主目录。

cd ~

命令:获取 Amazon ECR 存储库 URI,并将其复制到文本编辑器。将在下一步中需要用到此值。

echo ${REPOSITORY_URI}654948215222.dkr.ecr.us-east-2.amazonaws.com/web2048

命令:为任务定义创建文件。

vim web2048_task_definition.json

将以下内容添加到任务定义文件中。将 image: 键的存储库 URI 替换为上一步的值,并将 executionRoleArntaskRoleArn 的值替换为executionRoleArn 值:arn:aws:iam::654948215222:role/LabStack-2848353a-a5d2-4c70-b-ECSTaskExecutionRole-1VLGSX361UAJV

请勿删除各行的"executionRoleArn":taskRoleArn:image:部分,只删除冒号后的值。另外,映像值应以 “https://” 开头。它应当以 AWS 账户 ID 开头,以标签:latest 结尾。这些值是字符串,因此应使用双引号括起来。

{"family": "web2048","networkMode": "awsvpc","taskRoleArn": "arn:aws:iam::654948215222:role/LabStack-2848353a-a5d2-4c70-b-ECSTaskExecutionRole-1VLGSX361UAJV","executionRoleArn": "arn:aws:iam::654948215222:role/LabStack-2848353a-a5d2-4c70-b-ECSTaskExecutionRole-1VLGSX361UAJV","containerDefinitions": [{"name": "web2048","image": "654948215222.dkr.ecr.us-east-2.amazonaws.com/web2048:latest","portMappings": [{"containerPort": 80,"hostPort": 80,"protocol": "tcp"}],"essential": true}],"requiresCompatibilities": ["FARGATE"],"cpu": "256","memory": "512"
}

完成文件编辑后,关闭 vim 编辑器。

命令:运行以下命令,注册新的任务定义:

aws ecs register-task-definition --cli-input-json file://web2048_task_definition.json

成功创建后,应该会获得包含任务定义详细信息的 JSON 输出。

image-20230903210403578

接下来,创建一个服务。该服务运行并维护指定任务定义中所需数量的任务。如果服务中运行的任务数量降到 desiredCount 以下,则 Amazon ECS 将在指定的集群中运行该任务的另一个副本。要创建服务,可以将参数传递给 AWS CLI,也可以传递 --cli-input-json 标记(与任务定义的方法相同)。本实验室使用 json 文件方法。

命令:为服务创建新的输入文件:

vim web2048_service.json

复制下面的文本并粘贴到文件编辑器中。

{"cluster": "web2048","serviceName": "web2048","taskDefinition": "web2048","loadBalancers": [{"targetGroupArn": "arn:aws:elasticloadbalancing:us-east-2:654948215222:targetgroup/ECS-Target-Group/69261bec57f1aaa4","containerName": "web2048","containerPort": 80}],"desiredCount": 2,"launchType": "FARGATE","platformVersion": "LATEST","networkConfiguration": {"awsvpcConfiguration": {"subnets": ["subnet-0cf27533f0902b9e9","subnet-04a7886526e89872e"],"securityGroups": ["sg-058441d03931d04d1"],"assignPublicIp": "ENABLED"}}
}

targetGroupArn 值、PublicSubnet1PublicSubnet2ecsSecurityGroup 替换为在实验说明左侧显示的值。

  • arn:aws:elasticloadbalancing:us-east-2:654948215222:targetgroup/ECS-Target-Group/69261bec57f1aaa4

  • subnet-0cf27533f0902b9e9

  • subnet-04a7886526e89872e

  • sg-058441d03931d04d1

完成文件编辑后,关闭 vim 编辑器。

命令:创建服务:

aws ecs create-service --cli-input-json file://web2048_service.json

成功创建后,您应该会获得包含服务详细信息的 JSON 输出。服务创建任务仅需数秒;但是,创建服务后,就会预置所需数量的任务,任务将进入待处理状态,最终任务状态将变为 RUNNING(正在运行)。

命令:您可以通过运行以下命令来查看任务状态:

aws ecs describe-clusters --cluster web2048

预期输出

[root@ip-10-0-0-185 ~]# aws ecs describe-clusters --cluster web2048
{"clusters": [{"status": "ACTIVE","defaultCapacityProviderStrategy": [],"statistics": [],"capacityProviders": [],"tags": [],"clusterName": "web2048","settings": [],"registeredContainerInstancesCount": 0,"pendingTasksCount": 2,"runningTasksCount": 0,"activeServicesCount": 1,"clusterArn": "arn:aws:ecs:us-east-2:654948215222:cluster/web2048"}],"failures": []
}

记下 active ServiceCount 的值,这表示与处于 ACTIVE(活跃)状态的集群关联的服务数。还要记下 pendingTasksCountrunningTaskCount 的值。创建服务时,您将看到待处理任务的数量变化,当任务完成时,它们的状态变为 RUNNING(正在运行),并且 runningTasksCount 的值会反映 desiredCount 的值。

在本实验中,服务中定义了两个任务。几分钟后,任务应当进入 RUNNING(正在运行)状态。您可以重复前面的命令来监控进度。当 runningTaskCount 值等于 2 时,继续下一步。

image-20230903211210163

image-20230903211612016

image-20230903211646981

image-20230903211725845

image-20230903211900385

下图显示了自己创建的资源以及我们为您创建的资源:

image-20230903211229296


任务 6:测试应用程序

从实验说明屏幕的左侧复制 albPublicDnsUrl 值,并将其粘贴到 Web 浏览器的新标签页中。Lab-3-ALB-1477954992.us-east-2.elb.amazonaws.com

image-20230903211353504

随后系统将为您显示 web2048 应用程序。使用电脑上的箭头键玩游戏,以便测试应用程序。此方法应该与在命令主机上测试容器相同。

image-20230903211418104

总结

  • 了解构建 Docker 映像所需的步骤
  • 将容器映像上传到 Amazon ECR 存储库,以便用于部署 Amazon ECS
  • 将存储库中的容器部署到 AWS Fargate 集群
  • 使用在 Amazon ECS Fargate 集群上运行的 AWS CLI 和容器来部署示例应用程序

相关文章:

【AWS实验 】在 AWS Fargate 上使用 Amazon ECS 部署应用程序

文章目录 实验概览目标实验环境任务 1&#xff1a;连接到实验命令主机任务 2&#xff1a;将应用程序容器化任务 3&#xff1a;构建 Web2048 容器任务 4&#xff1a;创建 Amazon ECR 存储库并推送 Docker 映像任务 5&#xff1a;创建 ECS 集群任务 6&#xff1a;测试应用程序总结…...

matlab几种求解器的选择fsolve-sole-vpasolve

文章目录 fsolvesolvevpasovle总结vpasovle的结果fsovle的结果 fsolve 求数值解 result_xfsolve(my_fun,x0,options)参数: my_fun:待求解函数&#xff0c;作为一个.m文件 x0:初始值&#xff0c;向量&#xff0c;可以仅仅指定其中的几项solve 强大的求解器。在方程组中求解析…...

无限访问 GPT-4,OpenAI 强势推出 ChatGPT 企业版!

继 ChatGPT 收费大降价、推出 App 版等系列动作之后&#xff0c;OpenAI 于今日宣布正式发布面向企业的 AI 助手——ChatGPT Enterprise 版。 与 To C 端的 ChatGPT 版本有所不同的是&#xff0c;该版本可以以更快速度无限制地访问 GPT-4&#xff0c;还可以用来处理更长输入的上…...

MySQL的故事——Schema与数据类型优化

Schema与数据类型优化 一、选择优化的数据类型 更小的通常更好 应该尽量使用可以正确存储数据的最小类型&#xff0c;更小的数据类型通常更快&#xff0c;因为他们占用更少的磁盘&#xff0c;内存和CPU缓存&#xff0c;并且处理时需要的CPU周期更少 简单就好 更简单的数据类型…...

C++编译和链接

编译和链接 一、源代码的组织 头文件&#xff08;.h&#xff09;&#xff1a;#include头文件、函数的声明、结构体的声明、类的声明、模板的声明、内联函数、#define和const定义的常量等。 源文件&#xff08;.cpp&#xff09;&#xff1a;函数的定义、类的定义、模板具体化的…...

【CSDN技术】Markdown编辑器如何使用-csdn博客编写入门

Markdown编辑器如何使用-csdn博客编写入门 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自…...

【docker】运行redis

拉取redis镜像 有多种选择&#xff1a; redis&#xff08;基础版&#xff09;redis/redis-stack&#xff08;包含redis stack server和RedisInsight&#xff09;redis/redis-stack-server&#xff08;仅包含redis stack server&#xff09; docker pull redis docker pull r…...

Paddle训练COCO-stuff数据集学习记录

COCO-stuff数据集 COCO-Stuff数据集对COCO数据集中全部164K图片做了像素级的标注。 80 thing classes, 91 stuff classes and 1 class ‘unlabeled’ 数据集下载 wget --directory-prefixdownloads http://images.cocodataset.org/zips/train2017.zip wget --directory-prefi…...

SpringBoot 框架学习

java 学习笔记指路 基础知识 Python转java补充知识 Java中常见的名词解释 前端 【黑马程序员pink老师前端】HTML 【黑马程序员pink老师前端】JavaScript基础大总结 【黑马程序员pink老师前端】JavaScript函数与作用域 【黑马程序员pink老师前端】JavaScript对象 数据库 【黑马程…...

java - lua - redis 完成商品库存的删减

java调用lua脚本完成对商品库存的管理 主页链接 微风轻吟挽歌的主页 如若有帮助请帮忙点赞 //lua脚本 获取到内存不够的商品StringBuilder sb new StringBuilder();//定义一个数组存储可能缺少库存的值sb.append(" local table {} ");//获取值sb.append(" …...

dbeaver离线安装clickhouse连接驱动

Clickhouse 数据库连接工具——DBeaver 主要介绍了Clickhouse 数据库连接工具——DBeaver相关的知识&#xff0c;希望对你有一定的参考价值。 Clickhouse 数据库连接工具——DBeaver 1.下载 DBeaver 和 连接驱动 https://dbeaver.io/files/dbeaver-ce-latest-x86_64-setup.…...

2024腾讯校招后端面试真题汇总及其解答(二)

11.如果同时有5个任务在10分钟之后提交,或者更多,那么如果是一个个从队列中拿数据,那么前一个任务会影响后续任务执行时间,说一下解决思路 你的问题是一个典型的并发处理问题。如果你的系统是单线程的,那么的确,前一个任务的执行时间会影响后续任务的执行时间。但是,你…...

datagrip 相关数据连接信息无缝迁移

背景 因为公司换电脑了&#xff0c;接触的项目比较多&#xff0c;不同项目&#xff0c;不同环境的数据库连接有好几十个&#xff0c;如果在新电脑上挨个重新连接一遍劳心劳力&#xff0c;所以想看一下能不能直接将之前保存的连接信息直接迁移到新的电脑上面。 为此&#xff0c…...

不就是G2O嘛

从零开始一起学习SLAM | 理解图优化&#xff0c;一步步带你看懂g2o代码 SLAM的后端一般分为两种处理方法&#xff0c;一种是以扩展卡尔曼滤波&#xff08;EKF&#xff09;为代表的滤波方法&#xff0c;一种是以图优化为代表的非线性优化方法。不过&#xff0c;目前SLAM研究的主…...

C#开发的OpenRA游戏之系统参数选项按钮

C#开发的OpenRA游戏之系统参数选项按钮 前面分析了信标按钮,从图上可以看到,靠右边的按钮,就是系统参数选项按钮: 这个按钮与前面三个按钮是不一样的,虽然它们在排列位置上是放在一起,但是处理的方法方式是不一样的,因为这个选项按钮,并不需要发命令给服务器,再返回来…...

苹果启动2024年SRDP计划:邀请安全专家使用定制iPhone寻找漏洞

苹果公司昨天&#xff08;8月30日&#xff09;正式宣布开始接受2024 年iPhone安全研究设备计划的申请&#xff0c;iOS 安全研究人员可以在 10 月底之前申请安全研究设备 SRD。 SRD设备是专门向安全研究人员提供的iPhone14Pro&#xff0c;该设备具有专为安全研究而设计的特殊硬…...

std::make_shared和new初始化智能指针的区别

先看代码&#xff1a; class Base {public:Base(int num):a(num) {std::cout << "Base() construct" << std::endl;}~Base() {std::cout << "Base() deconstruct" << std::endl;}int Get() {return a;}private:int a; };void tes…...

无涯教程-JavaScript - ERFC.PRECISE函数

描述 ERFC.PRECISE函数返回x和无穷大之间集成的互补ERF函数。 互补误差函数等于1-ERF(即1-误差函数),由等式给出- $$Erfc(x) \frac {2} {\sqrt {\pi}} \int_ {x} ^ {\infty} e ^ {-t ^ 2} dt $$ 语法 ERFC.PRECISE(x)争论 Argument描述Required/OptionalxThe lower bound…...

2023国赛数学建模C题思路分析 - 蔬菜类商品的自动定价与补货决策

# 1 赛题 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c; 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…...

手写Spring:第1章-开篇介绍,手写Spring

文章目录 一、手写Spring二、Spring 生命周期 一、手写Spring &#x1f4a1; 目标&#xff1a;我们该对 Spring 学到什么程度&#xff1f;又该怎么学习呢&#xff1f; 手写简化版 Spring 框架&#xff0c;了解 Spring 核心原理&#xff0c;为后续再深入学习 Spring 打下基础。在…...

C语言中,字节对齐是一种重要的内存管理概念

C语言中&#xff0c;字节对齐是一种重要的内存管理概念 字节对齐的目的是为了提高内存访问的效率。因为CPU访问内存的最小单位是字节&#xff0c;所以如果数据结构的成员以正确的字节边界对齐&#xff0c;那么CPU就可以直接访问这些成员&#xff0c;而不需要进行额外的内存移动…...

网络丢包问题,敢不敢这样定位?

下午好&#xff0c;我的网工朋友。 所谓丢包&#xff0c;是指在网络数据的收发过程中&#xff0c;由于种种原因&#xff0c;数据包还没传输到应用程序中&#xff0c;就被丢弃了。 这些被丢弃包的数量&#xff0c;除以总的传输包数&#xff0c;也就是我们常说的丢包率。 丢包…...

【漏洞复现】H3C路由器信息泄露任意用户登录

漏洞描述 通过访问特地址得到密码可进行登录。 免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c;遵守公共秩序&#xff0c;尊重社会公德&#xff0c;不得利用网络从事危害国家安全、荣誉和利益&#xff0c;未经授权请勿利用文章中…...

随机数算法,SQL

SELECT* FROMprizes_config WHEREweight > ( SELECT FLOOR( RAND() * MAX( weight )) FROM prizes_config ) order by weight asc-- LIMIT 1;记录 id 权重 1 5 2 10 3 50 4 100 找权重最大的那个值&#xff0c;调用rand()函数&#…...

什么是软件测试+软件测试的分类【软件测试】

软件测试 什么是软件&#xff1f; 软件 程序 数据 文档 软件测试的对象有哪些&#xff1f;程序 数据 文档 C/S与B/S架构 C/S&#xff1a;客户端服务器&#xff0c;这种就是我们一定要安装一个客户端才能够用的软件&#xff0c;就叫C/S。比如&#xff1a;微信、qq B/S&am…...

2023国赛C题解题思路:蔬菜类商品的自动定价与补货决策

本次将全程提供国赛C题完整解题思路及代码&#xff0c;同时共享一些国赛论文模板等资料&#xff0c;需要的小伙伴可以关注一下&#xff0c;持续更新&#xff01;大家也可以关注B站视频&#xff1a;不知名数学家小P 实时更新 本次C题是一道较为简单的统计分析题目&#xff0c;建…...

MIT6.824 Spring2021 Lab 1: MapReduce

文章目录 0x00 准备0x01 MapReduce简介0x02 RPC0x03 调试0x04 代码coordinator.gorpc.goworker.go 0x00 准备 阅读MapReduce论文配置GO环境 因为之前没用过GO,所以 先在网上学了一下语法A Tour of Go 感觉Go的接口和方法的语法和C挺不一样, 并发编程也挺有意思 0x01 MapRed…...

JavaScript 日期 – 如何使用 DayJS 库在 JS 中处理日期和时间

当涉及到在 JavaScript 中处理日期和时间时,开发人员经常发现自己正在努力应对内置对象的复杂性Date。 虽然普通 JavaScript 提供了基本功能,但使用起来可能相当麻烦,尤其是在处理解析、格式化和操作日期时。 这就是像 DayJS 这样的外部库发挥作用的地方,它提供了大量的优…...

Docker基础入门:Docker基础总结篇--超详细

Docker基础入门&#xff1a;Docker基础总结篇[docker3要素、docker安装配置、容器使用、镜像管理发布] 一、Docker 3要素1.1、镜像&#xff08;Image&#xff09;1.2、容器&#xff08;Container&#xff09;1.3、仓库&#xff08;Registry&#xff09;1.4 、总结 二、Docker安…...

对象临时中间状态的条件竞争覆盖

Portswigger练兵场之条件竞争 &#x1f984;条件竞争之对象临时中间状态的条件竞争 Lab: Partial construction race conditions&#x1f680;实验前置必要知识点 某些框架尝试通过使用某种形式的请求锁定来防止意外的数据损坏。例如&#xff0c;PHP 的本机会话处理程序模块…...

网站建设 事项/直销产业发展论坛

我越来越担心我作为一个测试工程师的未来。 恍然间&#xff0c;发现自己在这个行业里已经摸爬滚打了五年了&#xff0c;原以为自己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了&#xff0c;但是今年在换工作的过程中却遭到了重大的挫折。详细过…...

广州市委/整站优化 mail

题目&#xff1a;原题链接&#xff08;困难&#xff09; 标签&#xff1a;树、二叉树、二叉搜索树 解法时间复杂度空间复杂度执行用时Ans 1 (Python)O(N)O(N)O(N)O(N)O(N)O(N)476ms (42.39%)Ans 2 (Python)Ans 3 (Python) 解法一&#xff1a; class Solution:def __init__(s…...

wordpress增加标签/百度移动排名优化软件

佳能lbp2900打印机驱动是佳能LBP-2900黑白激光打印机的官方最新驱动程序。佳能lbp2900打印机驱动Win2000/XP/Win7操作系统的安装。这款驱动是佳能LBP-2900黑白激光打印机必备的驱动程序&#xff0c;如果没有安装该驱动你就无法正常使用打印机也无法被电脑识别该设备。推荐有需要…...

北京百度糯米团购有做网站的电话吗/网页设计软件dreamweaver

十多年前&#xff0c;大学刚毕业&#xff0c;在Autodesk上海做c开发工程师。 十一年后&#xff0c;已经人到中年&#xff0c;还在努力中。↖(^ω^)↗ 努力&#xff0c;奋斗~ 转载于:https://www.cnblogs.com/SunWentao/p/9204971.html...

免费云主机试用一年/上海网站营销seo方案

ing我们知道很多时候加在动词后面是表示进行时,但很多动词加ing也可以变成一个形容词或名词. 同样ed一般表过去式,但也能做形容词 ing后缀常用词 including 包含 according 相符的 依照 meeting 会议 training 训练 feeling 感觉 painting 绘画 interesting 有趣的 beg…...

常用的电子商务网站开发技术/抚州网络推广

在企业网络信息化建设中&#xff0c;经常会使用AD域(Active Directory Domain)来统一管理网络中的PC终端。在AD域中&#xff0c;DC(域控制器)包含了由这个域的账户、密码、属于这个域的计算机等信息构成的数据库。在今年的大型攻防实战演练中&#xff0c;我们发现使用AD域进行内…...