注意:
- 本教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure 免费套餐。
- 它对 Oracle Cloud Infrastructure 身份证明、租户和区间使用示例值。完成实验室后,请使用特定于云环境的那些值替换这些值。
仅使用事件规则和 Python 函数为 OCI 计算实例自动将实例元数据服务更新到版本 2
简介
确保云环境的安全性和一致性是现代企业的首要任务。在 Oracle Cloud Infrastructure (OCI) 中,实例元数据服务 (Instance Metadata Service,IMDS) 提供特定于实例的关键信息,并强制使用版本 2 (IMDSv2) 通过要求基于会话的验证来增强安全性。在所有 OCI 计算实例中自动升级到 IMDSv2 是保持此安全标准并减少手动开销的有效方法。
本教程演示如何使用 OCI 事件服务规则和 OCI 函数构建自动化、事件驱动的工作流,以强制执行 IMDSv2 更新。通过利用基于 Python 的自动化,您将创建和配置必要的 OCI 资源(例如动态组、事件规则和无服务器功能),以无缝确保符合此增强的安全协议。
目标
- 在 OCI 中自动将 IMDS 更新到版本 2,可确保更好的安全性和对实例元数据访问的控制。通过使用事件规则和 Python 函数,您可以创建自动化工作流,以便在启动新实例时强制执行此更新。此方法简化了实例元数据设置的管理,同时在您的云环境中保持一致。
先决条件
-
Oracle Cloud Infrastructure 命令行界面 (OCI CLI) 和 Python 软件开发工具包 (SDK):安装和配置 OCI CLI 和 Python SDK 以进行编程访问。
-
Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) 策略:确保实施所需的 OCI IAM 策略来管理动态组、函数和事件规则。
-
区间 Oracle Cloud 标识符 (OCID):获取将部署资源的区间的 OCID。
-
Python 环境:使用已安装的 OCI 库 (
pip install oci
) 设置 Python。 -
OCI 函数设置:确保在租户中启用了 OCI 函数,并且为部署配置了 Docker 环境。
-
用户权限:确保您有权创建和管理 OCI 资源。
任务 1:创建动态组
定义动态组以允许函数访问目标实例。要使用其他 OCI 服务,您的函数必须属于动态组。
ALL {resource.type = 'fnfunc'}
指定匹配规则时,建议将区间中的所有函数与以下项进行匹配:
ALL {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaxxxxx'}
任务 2:定义 OCI IAM 策略
创建一个允许动态组管理计算实例的新策略。我们将授予对特定区间中实例的管理访问权限。
Allow dynamic-group dmg-for-functions to manage instance-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to manage functions-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to use virtual-network-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to manage instances in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to read repos in compartment Compartment-Name
任务 3:创建和部署 OCI 函数
创建、部署和调用用于 IMDS 更新的函数。
-
在 OCI 控制台中创建应用程序。
登录到 OCI 控制台,导航到 Developer Services(开发人员服务)、 Functions(函数)并单击 Applications(应用程序)。为 OCI Functions 选择适当的区域,然后单击创建应用程序。
-
为函数部署设置环境,在 OCI Cloud Shell 或 OCI Compute 实例(运行 Oracle Linux 8)或您计划创建和部署函数的任何系统上执行以下设置。
-
安装以下资源: Installing the CLI 、 Install Fn Project CLI 和 Install Oracle Cloud Infrastructure Python SDK 。
-
按照 OCI Functions QuickStart on an OCI Compute Instance 中的详细设置指南来准备环境。此准备工作可确保您的环境可以无缝地创建、部署和管理 OCI Functions。
注:请验证是否已在 OCI 注册表中为您的函数映像创建了资料档案库。
-
-
登录到 OCI Cloud Shell 或 OCI Compute 实例,并访问要在其中创建函数的 OCI Cloud Shell 或 OCI Compute 实例。设置 OCI 函数 CLI 的上下文以指定将部署函数的区域。
fn use context <region-name> Replace <region-name> with the appropriate region (e.g., ap-hyderabad-1).
-
使用区间 ID 更新上下文。运行以下命令以设置应用程序将驻留的区间。
fn update context oracle.compartment-id <compartment-ocid>
-
设置 OCI 注册表。输入唯一的资料档案库名称前缀以区分函数映像。运行以下命令以更新注册表。
fn update context registry <region-key>.ocir.io/<tenancy-namespace>/<repo-name-prefix> Example: ap-hyderabad-1.ocir.io/namespace/prefix.
-
在您的用户配置文件下从 OCI 控制台生成验证令牌,然后运行以下命令以使用验证令牌登录到容器注册表。
docker login -u '<tenancy-namespace>/<user-id>' <region-key>.ocir.io
-
通过列出应用程序确认应用程序设置正确。请运行以下命令列出应用程序。
fn list apps
-
使用 Python 运行时创建一个名为
imdsupdate
的新函数并初始化该函数。fn init --runtime python imdsupdate
-
运行以下命令以导航到创建的目录。
cd imdsupdate
-
运行
ls
命令以列出生成的文件。ls
任务 4:更新 Python 函数代码
-
在目录中打开和编辑生成的 Python 文件(例如
func.py
),并将以下 python 代码添加到逻辑的函数文件中。import io import json import logging from fdk import response import oci def handler(ctx, data: io.BytesIO = None): try: # Authenticate using Instance Principals signer = oci.auth.signers.get_resource_principals_signer() body = json.loads(data.getvalue()) logging.getLogger().info("Event body: " + str(body)) # Extract Required Details From Event Rule instance_id = body["data"]["resourceId"] # Instance OCID action_type = body["eventType"] logging.getLogger().info("Action type: " + action_type) # Proceed only if instance creation event if action_type == "com.oraclecloud.computeapi.launchinstance.end": compute_client = oci.core.ComputeClient(config={}, signer=signer) update_instance_imds(compute_client, instance_id) except (Exception, ValueError) as ex: logging.getLogger().error("Error: " + str(ex)) return response.Response( ctx, response_data=json.dumps({"message": "Error: " + str(ex)}), headers={"Content-Type": "application/json"}, ) return response.Response( ctx, response_data=json.dumps({"message": "Function executed successfully"}), headers={"Content-Type": "application/json"}, ) def update_instance_imds(compute_client, instance_id): """ Updates the instance metadata service (IMDS) configuration to disable legacy endpoints. """ try: # Fetch instance details instance_details = compute_client.get_instance(instance_id).data # Update instance configuration update_details = oci.core.models.UpdateInstanceDetails( instance_options=oci.core.models.InstanceOptions( are_legacy_imds_endpoints_disabled=True # Disable legacy endpoints ) ) response = compute_client.update_instance(instance_id, update_details) logging.getLogger().info( f"Successfully updated IMDS for instance {instance_id}: {response.data}" ) except Exception as ex: logging.getLogger().error("Failed to update IMDS: " + str(ex)) raise
-
更新
requirements.txt
文件。fdk>=0.1.86 oci==2.138.0
-
运行以下命令以将函数部署到创建的应用程序。
fn -v deploy --app <application-name> Example: fn -v deploy --app functionpyth.
这些步骤可确保创建、部署和调用该函数,以便在 OCI 中自动执行 IMDS 版本更新。
任务 5:定义事件规则
使用 OCI 事件服务检测何时创建新的 OCI 计算实例。
要配置事件规则,请输入以下信息。
- 事件源:选择计算实例。
- 条件:选择事件类型为实例–启动结束。
- 操作:选择触发函数,输入函数、函数区间、函数应用程序以及要触发您在任务 4 中创建的函数。
任务 6:验证实例 IMDS 值
启动新实例以触发事件规则并验证实例元数据服务配置。虚拟机 (Virtual Machine,VM) 创建完成后,它将自动将 IMDS 值设置为仅版本 2。
这些配置特定于区域和区间。如果要调用其他区间中的同一函数,请在该区间中创建事件规则并设置用于触发此函数的规则。
通过完成这些任务,您将自动为特定区间中的 OCI 计算实例将 IMDS 版本更新到 v2。
相关链接
确认
- 作者 — Akarsha I K(云架构师)
更多学习资源
浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Automate the Instance Metadata Service update to version 2 only for OCI Compute Instances using Event Rules and Python Functions
G24782-01
January 2025