【问题标题】:AWS Boto3 and Classic ELBsAWS Boto3 和经典 ELB
【发布时间】:2017-07-19 02:19:27
【问题描述】:

我正在尝试在经典负载均衡器(elb,而不是 elbv2)上获取活动 TLS 策略,但我无法确定这里出了什么问题:

import boto3
from botocore.exceptions import ClientError

#Declare Constant
EXPECTED_POLICY = 'ELBSecurityPolicy-TLS-1-1-2017-01'
IAMID = '518031149234'

def set_session(awsprofile, awsregion):
    try:
        session = boto3.Session(profile_name=awsprofile, region_name=awsregion)
        return session
    except ClientError as e:
        print("Failed to run session setter for profile: {0} %s" % e).format(awsprofile)

def assume_role_into_account(profileId, assumeId, sessionName, assetType, regionName):
    try:
        setSession = set_session(profileId, regionName)
        stsSession = setSession.client('sts')
        response = stsSession.assume_role(RoleArn=("arn:aws:iam::{0}:role/security").format(assumeId),RoleSessionName=sessionName)
        credentials = response['Credentials']
        session = setSession.client(assetType, aws_access_key_id=credentials['AccessKeyId'],aws_secret_access_key=credentials['SecretAccessKey'],aws_session_token=credentials['SessionToken'])
        return session
    except ClientError as e:
        print("AssumeRole exception for profile: {0} %s" % e).format(profileId)

def main():

    try:
        srev2 = assume_role_into_account('sre', IAMID,'Security-Audit-AssumeRole-Session2', 'elb', 'us-east-1')
        print("AssumeRole into Account: {0} for Region: {1} .").format(IAMID, 'us-east-1')

    elbs = srev2.describe_load_balancers()

    for elb in elbs:
        policy = session.describe_load_balancer_policies(LoadBalancerName=elb)

    except ClientError as e:
        print("AssumeRole: Cannot assumerole for id: {0}." % e).format(IAMID)

if __name__ == '__main__':
    main()

所以当我调用describe_load_balancer_policies()时返回policy时,无法区分选择了哪个policy。

有什么帮助吗?

TIA!

【问题讨论】:

  • 如果重要,请使用 Boto3 版本 1.4.4。

标签: boto boto3 elastic-load-balancer botocore


【解决方案1】:

如果您不粘贴相关的错误消息,将很难提供帮助。

从快速的角度来看,我猜你在assume_role_into_account 中定义了局部变量session,它在main() 中无法访问

如果是这个问题,可以改成

def assume_role_into_account(profileId, assumeId, sessionName, assetType, regionName):
  global session
  ....

参考:

Python - Global, Local and nonlocal Variables

【讨论】:

  • 我没有收到错误消息,我从两个不同的策略中得到了相同的结果。如,我没有什么可以过滤的。甚至字典中的位置因elb而异。
【解决方案2】:

好的,在与 Amazon 的 API 和 ELB 团队人员进行了长时间讨论之后……这是我们的想法,请注意,这仅适用于经典 ELB。这确实会每次都返回您在 AWS Web 控制台中看到的 ELB 策略。

我在这方面花了很多时间,我希望它对其他也研究过这种耗时、几乎没有结果的努力的人有所帮助:

elbs = client.describe_load_balancers()

for elb in elbs:
    #Get Named Policy to pass to get the active policy. -1 denotes the last in the list.
    policy_name = jmespath.search('ListenerDescriptions[].PolicyNames[] | [-1]', elb)

    policy_description = client.describe_load_balancer_policies(LoadBalancerName=elb, PolicyNames=[policyname])
    console_policy = jmespath.search('PolicyDescriptions[?PolicyName==`{0}`] | [0].PolicyAttributeDescriptions[0].AttributeValue'.format(policyname), policy_description)

    return console_policy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 2021-01-10
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 2014-04-06
    • 2017-12-09
    相关资源
    最近更新 更多