我想编写一个Python脚本,使用Cloud Armor在 Google Cloud Platform 中为Compute Engine REST API更新或添加新规则。
但是我有几个疑问:
Google Cloud Client Library for Python官员是否适合此目的(如果您没有提出建议)?
我应该为此安装哪个Python package?
此standard authentication(包含我的私钥并正确设置环境变量GOOGLE_APPLICATION_CREDENTIALS
的JSON文件)是否足以连接到此API,目的是我想实现吗?
我要问路。
答案 0 :(得分:1)
Python脚本是一个不错的选择,您可以使用Google APIs Python client library来实现。
用于Python的Google Cloud Client库可能不够用,但是Google Cloud Client库是用于调用Google Cloud API的最新且推荐的客户端库。
Compute Engine v1 securityPolicies
REST API resource提供了您需要的方法列表,例如addRule
,getRule
和patchRule
,以添加新规则,分别检索和更新现有规则。
检出PyDoc reference for the Compute Engine API以获得方法的完整列表,并说明如何使用它们。
此外,您需要使用Python Package(Google API Python客户端库)。
您提到的standard authentication提供了一种有用的方法,用于通过Python客户端库授权对Compute Engine API的请求。
根据official doc:GCP客户端库使用一种称为“应用程序默认凭据”(ADC)的策略来查找应用程序的凭据。当您的代码使用客户端库时,该策略将按以下顺序检查您的凭据:
- 首先,ADC检查环境变量是否 GOOGLE_APPLICATION_CREDENTIALS已设置。如果设置了变量,则ADC 使用变量指向的服务帐户文件。下一个 本节介绍了如何设置环境变量。
- 如果未设置环境变量,则ADC使用默认服务 计算引擎,Kubernetes引擎,App Engine和 云功能为运行在这些功能上的应用程序提供 服务。
- 如果ADC无法使用以上任一凭据,则会发生错误。
最后,请确保您选择使用的用户帐户具有在Compute引擎上配置Cloud Armor所需的正确IAM permissions。
答案 1 :(得分:-1)
import googleapiclient.discovery
from google.oauth2 import service_account
from pprint import pprint
import logging
if LOCAL == 'True':
credentials = service_account.Credentials.from_service_account_file(
'path-to-service-account.json')
compute = googleapiclient.discovery.build('compute',
'v1',
credentials=credentials)
else:
compute = googleapiclient.discovery.build('compute',
'v1')
class cloud_armor():
def __init__(self, domain):
self.domain = domain
self.project_id = <PROJECT_ID>
self.policy_name = <POLICY_NAME>
def add_rule(self):
#Find minimum current priority
current_policy = cloud_armor.get_policy(self)
current_rules = current_policy['rules']
rule_priorities = []
for rule in current_rules:
rule_priorities.append(rule['priority'])
priority = int(min(rule_priorities)) - 1
body = {
"description": "{}".format(self.domain),
"priority": priority,
"match": {
"expr": {
"expression": "request.headers['referer']=="{}"".format(
self.domain)
}
},
"action": "allow",
"preview": False,
"kind": "compute#securityPolicy"
}
try:
policies = compute.securityPolicies()
rule = policies.addRule(project=self.project_id,
securityPolicy=self.policy_name,
body=body
).execute()
return rule
except Exception as err:
for i in range(0, len(err.args)):
logging.error(err.args[i])
pprint(err.args[i])
print("==Policy Rule Failed to Add==")
raise Exception("Policy Rule Failed to Add")
def get_policy(self):
try:
policies = compute.securityPolicies()
policy = policies.get(project=self.project_id,
securityPolicy=self.policy_name
).execute()
return policy
except Exception as err:
for i in range(err.args):
logging.error(err.args[i])
pprint(err.args[i])
print("==Failed to Fetch Policy==")
raise Exception("Failed to Fetch Policy")