如何解决是否可以从 Azure Python SDK 获取 ASC 位置?
我正在使用 Microsoft Azure Security Center (ASC) Management Client Library 获取订阅的安全分数。库中的所有操作都表明
您不应直接实例化此类,而应创建一个 Client 实例,该实例将为您创建它并将其附加为属性。
因此,我正在创建一个具有以下规范的 SecurityCenter 客户端:
securitycenter(credentials,subscription_id,asc_location,base_url=None)
但是,在我看来,正确获取 asc_location
信息的唯一方法是使用 securitycenter 客户端来获取它... The spec 与上面的引用相同,{{ 1}}。所以我一直无法创建客户端,因为我需要 ASC 位置才能这样做,我需要创建客户端来获取 ASC 位置。
文档中提到
在 Python SDK 文档中搜索和搜索此“获取位置”没有给我任何信息(除了 REST API)。我错过了什么吗?我们是否应该像 SDK 存储库中的 this SO post 或 this GitHub issue 那样对位置进行硬编码?
解决方法
如官方 API 参考 list locations 所示:
特定订阅的负责 ASC 的位置(主页 地区)。对于每个订阅,只有一个负责位置。
它不会改变,因此如果您已经知道您订阅的 ref_code
的值,您可以对该值进行硬编码。
但每个订阅可能有不同的 asc_location 值(我的 2 个 Azure 订阅有不同的 asc_location 值)。
所以如果你有很多 Azure 订阅,你可以通过 API 查询 class PaymentView(View):
def get(self,*args,**kwargs):
order = Order.objects.get(user=self.request.user,ordered=False)
if order.billing_address:
context = {
'order': order,'DISPLAY_COUPON_FORM': False,'STRIPE_PUBLIC_KEY': settings.STRIPE_PUBLIC_KEY
}
return render(self.request,'payment.html',context)
else:
messages.warning(self.request,"You've not added billing address.")
return redirect('e_commerce:checkout')
def post(self,ordered=False)
token = self.request.POST.get('stripeToken')
amount = int(order.get_total()*100) # cents
try:
charge = stripe.Charge.create(
amount=amount,currency="usd",source=token
)
# order.ordered = True
# create the payment
payment = Payment()
payment.stripe_charge_id = charge['id']
payment.user = self.request.user
payment.amount = order.get_total()
payment.save()
# assign the payment to the order
order_items = order.items.all()
order_items.update(ordered=True)
for item in order_items:
item.save()
order.ordered = True
order.payment = payment
# TODO assign ref code
order.ref_code = create_ref_code()
order.save()
# print("your order placed!")
messages.success(self.request,"your order was successful.")
return redirect("/e_commerce")
except stripe.error.CardError as e:
# Since it's a decline,stripe.error.CardError will be caught
body = e.json_body
err = body.get('error',{})
messages.warning(self.request,f"{err.get('messages')}")
return redirect("/e_commerce")
except stripe.error.RateLimitError as e:
# Too many requests made to the API too quickly
messages.warning(self.request,"Rate limit error")
return redirect("/e_commerce")
except stripe.error.InvalidRequestError as e:
# Invalid parameters were supplied to Stripe's API
messages.warning(self.request,"Invalid parameters,Please try again!")
return redirect("/e_commerce")
except stripe.error.AuthenticationError as e:
# Authentication with Stripe's API failed
# (maybe you changed API keys recently)
messages.warning(self.request,"Authentication error ")
return redirect("/e_commerce")
except stripe.error.APIConnectionError as e:
# Network communication with Stripe failed
messages.warning(self.request,"Network error")
return redirect("/e_commerce")
except stripe.error.StripeError as e:
# Display a very generic error to the user,and maybe send
# yourself an email
messages.warning(
self.request,"Something went wrong.You were not charged.Please try again.")
return redirect("/e_commerce")
except Exception as e:
# Something else happened,completely unrelated to Stripe
messages.warning(self.request,"A serious error occured.We have been notified.")
return redirect("/e_commerce")
messages.warning(self.request,"Invalid data received.")
return redirect("payment/stripe")
(据我所知,这是我能找到的唯一方法)然后使用SDK 获取安全分数,请尝试以下代码:
asc_location
,
我最近遇到了这个问题。
根据我的观察,我可以使用订阅下的任何位置来启动 SecurityCenter 客户端。然后 client.locations.list()
正好给了我一个 ASC 位置。
# Any of SubscriptionClient.subscriptions.list_locations will do
location = 'eastasia'
client = SecurityCenter(
credential,my_subscription_id,asc_location=location
)
data = client.locations.list().next().as_dict()
pprint(f"Asc location: {data}")
就我而言,无论我的输入是 westcentralus
,它始终是 eastasia
。
请注意,如果使用 get 而不是 list 会出现异常
data = client.locations.get().as_dict()
pprint(f"Asc location: {data}")
# azure.core.exceptions.ResourceNotFoundError: (ResourceNotFound) Could not find location 'eastasia'
所以我做的有点尴尬,
- 使用我订阅的位置创建一个 SecurityCenter 客户端
- client.locations.list() 获取 ASC 位置
- 使用检索到的 ASC 位置再次创建 SecurityCenter 客户端。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。