用于通过REST API在Google Cloud Platform中的Cloud Armor中更新规则的Python脚本

时间:2019-06-18 14:28:52

标签: python-3.x rest authentication google-cloud-platform google-cloud-armor

我想编写一个Python脚本,使用Cloud Armor Google Cloud Platform 中为Compute Engine REST API更新或添加新规则。

但是我有几个疑问:

我要问路。

2 个答案:

答案 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提供了您需要的方法列表,例如addRulegetRulepatchRule,以添加新规则,分别检索和更新现有规则。

检出PyDoc reference for the Compute Engine API以获得方法的完整列表,并说明如何使用它们。

此外,您需要使用Python Package(Google API Python客户端库)。

您提到的standard authentication提供了一种有用的方法,用于通过Python客户端库授权对Compute Engine API的请求。

根据official doc:GCP客户端库使用一种称为“应用程序默认凭据”(ADC)的策略来查找应用程序的凭据。当您的代码使用客户端库时,该策略将按以下顺序检查您的凭据:

  
      
  1. 首先,ADC检查环境变量是否   GOOGLE_APPLICATION_CREDENTIALS已设置。如果设置了变量,则ADC   使用变量指向的服务帐户文件。下一个   本节介绍了如何设置环境变量。
  2.   
  3. 如果未设置环境变量,则ADC使用默认服务   计算引擎,Kubernetes引擎,App Engine和   云功能为运行在这些功能上的应用程序提供   服务。
  4.   
  5. 如果ADC无法使用以上任一凭据,则会发生错误。
  6.   

最后,请确保您选择使用的用户帐户具有在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")