如何在无法访问互联网的情况下在运行 Amazon Linux 1 或 Amazon Linux 2 的 EC2 实例上更新 yum 或安装软件包?

上次更新日期:2021 年 6 月 2 日

我在我的 Amazon Elastic Compute Cloud (Amazon EC2) 实例上运行 Amazon Linux 1 或 Amazon Linux 2。如果我的实例无法访问互联网,该如何更新 yum 或安装软件包?

简短描述

Amazon Linux 存储库在 Amazon Simple Storage Service (Amazon S3) 存储桶中托管。要在没有互联网连接的情况下在实例上更新和安装软件包,请创建一个 S3 Amazon Virtual Private Cloud (Amazon VPC) 网关终端节点。在 S3 VPC 网关终端节点中,包含一个允许访问存储库存储桶的策略。然后,将此 VPC 终端节点与实例子网的路由表关联。

注意:要启用 EPEL 等第三方存储库,您的 EC2 实例必须通过以下任何一种方式连接到互联网:

解决方法

注意:在使用此解决方法时请记住以下几点:

  • 确保附加到您的 EC2 实例的安全组允许出站 HTTP 流量。
  • 确保附加到 S3 VPC 终端节点的安全组允许来自 EC2 实例子网的入站 HTTP 流量。
  • 确保与 EC2 实例子网关联的网络 ACL 允许以下操作:
    使用端口 80 (HTTP) 和 443 (HTTPS) 传出流量到区域 S3 服务。
    使用临时 TCP 端口从区域 S3 服务传入流量。临时端口为 1024-65535。
    区域 S3 服务是包含 S3 接口终端节点的子网的 CIDR。或者,如果您使用 S3 网关,则区域 S3 服务是 S3 服务的公有 IP CIDR。网络 ACL 不支持前缀列表。要将 S3 CIDR 添加到网络 ACL 中,请使用 0.0.0.0/0 作为 S3 CIDR。您还可以将实际的 S3 CIDR 添加到 ACL 中。但是,请记住,S3 CIDR 可以随时更改。

1.    打开 Amazon EC2 控制台,然后选择您的实例。

2.    在 Networking(联网)选项卡上,记下 VPC IDSubnet ID(子网 ID)。

3.    打开 Amazon VPC 控制台,选择 Subnets(子网),然后选择您的 Subnet ID(子网 ID)。

4.    选择 Route Table(路由表)选项卡,然后记下 Route Table ID(路由表 ID)。

5.    选择 Endpoints(终端节点),然后选择 Create Endpoint(创建终端节点)。

6.    使用以下信息创建终端节点:

对于 Service name(服务名称),选择 com.amazonaws.[region].s3。选择您的资源所在的区域。例如,com.amazonaws.us-east-1.s3。有关区域代码的完整列表,请参阅可用区域

对于 VPC,选择您的实例的 VPC ID。

对于 Configure route tables(配置路由表),选择您的实例的 Route Table ID(路由表 ID)。

7.    对于 Policy(策略),选择 Full Access(完全访问)或 Custom(自定义)。

如果您选择 Full Access(完全访问),则您的终端节点策略将允许对 Amazon S3 的完全访问权限。

如果选择 Custom(自定义),则您必须允许对 Amazon Linux 存储库存储桶执行 API 调用 s3:GetObject

Amazon Linux 2

存储库托管在 S3 存储桶 arn:aws:s3:::amazonlinux.region.amazonaws.comarn:aws:s3:::amazonlinux-2-repos-region/* 中。以下示例策略允许 s3:GetObject API 调用。请将 region 替换为您的 AWS 区域。

{
    "Statement": [
        {
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::amazonlinux.region.amazonaws.com/*",
                "arn:aws:s3:::amazonlinux-2-repos-region/*"
            ]
        }
    ]
}

Amazon Linux 1

存储库托管在 S3 存储桶 arn:aws:s3:::packages.region.amazonaws.comarn:aws:s3:::repo.region.amazonaws.com 中。以下示例策略允许 s3:GetObject API 调用权限。请将 region 替换为您的 AWS 区域。

{
    "Statement": [
        {
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::packages.region.amazonaws.com/*",
                "arn:aws:s3:::repo.region.amazonaws.com/*"
            ]
        }
    ]
}

注意:请将资源 ARN 中的 Region 替换为您的实例所在的区域。有关更多信息,请参阅 Amazon S3 的终端节点策略

8.    选择 Create endpoint(创建终端节点)。

创建 S3 VPC 终端节点后,您就可以在您的 Amazon Linux 实例中安装和更新软件包。