【问题标题】:AWS boto3 create_policy() - specify policyDocumentAWS boto3 create_policy() - 指定 policyDocument
【发布时间】:2017-08-13 05:02:33
【问题描述】:

我正在使用 python 的 boto3 库来连接 AWS IoT。我想使用 create_policy() API 创建一个策略,但我不明白 policyDocument 字段要使用什么。我认为它与policyStatement 有关,但我无法弄清楚语法。这是我目前所拥有的。

from __future__ import print_function
import os
import sys
import boto3
from botocore.exceptions import ClientError
from colorama import Fore, Back, Style
from colorama import init
init()

thingType = 'TpmStation'
thingBaseName = thingType + '-'
thingPolicy = thingType + '-Policy-GenDerivedKey'

def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)

try:
    # Use system hosted credentials - see
    # http://docs.aws.amazon.com/cli/latest/userguide/installing.html
    # http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
    client = boto3.client('iot')

    policyDocument = {}
    policyDocument['Statement'] = []
    policyDocument['Statement'].append({})
    policyDocument['Statement'][0]['Effect'] = 'Allow'
    policyDocument['Statement'][0]['Action'] = []
    policyDocument['Statement'][0]['Action'].append('iot:Connect')
    policyDocument['Statement'][0]['Action'].append('iot:Publish')
    policyDocument['Statement'][0]['Action'].append('iot:Subscribe')
    policyDocument['Statement'][0]['Action'].append('iot:Receive')
    policyDocument['Statement'][0]['Action'].append('iot:GetThingShadow')
    policyDocument['Statement'][0]['Action'].append('iot:UpdateThingShadow')
    policyDocument['Statement'][0]['Resource'] = '*'
    response = client.create_policy(
        policyName = thingPolicy,
        policyDocument = policyDocument
    )
    if 200 != response['ResponseMetadata']['HTTPStatusCode']:
        eprint(Fore.RED + "ERROR: Unable to 'create_thing_type' " + Style.RESET_ALL)
        sys.exit(1)
    print(Fore.GREEN + "Created new policy '" + thingPolicy + "'" +
            Style.RESET_ALL)

except ClientError as e:
    exc_type, exc_obj, exc_tb = sys.exc_info()
    fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
    eprint(Fore.RED + "ERROR in " + fname + ':' + str(exc_tb.tb_lineno) + ' - ' + e.response['Error']['Code'] + ' - ' + e.response['Error']['Message'] + Style.RESET_ALL)
    sys.exit(1)

【问题讨论】:

    标签: python amazon-web-services iot boto3 policy


    【解决方案1】:

    经过多次迭代,我发现这是可行的

    from __future__ import print_function
    import os
    import sys
    import re
    import boto3
    from botocore.exceptions import ClientError
    from colorama import Fore, Back, Style
    from colorama import init
    init()
    
    thingType = 'TpmStation'
    thingBaseName = thingType + '-'
    thingPolicy = thingType + '-Policy-GenDerivedKey'
    
    def eprint(*args, **kwargs):
        print(*args, file=sys.stderr, **kwargs)
    
    try:
        # Use system hosted credentials - see
        # http://docs.aws.amazon.com/cli/latest/userguide/installing.html
        # http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
        client = boto3.client('iot')
    
        awsAccount = boto3.client('sts').get_caller_identity().get('Account')
        awsRegion = boto3.session.Session().region_name
        policyDocumentStr = '''
            {
                "Version": "2012-10-17",
                "Statement": [
                    {
                        "Effect": "Allow",
                        "Action": [
                            "iot:Publish"
                        ],
                        "Resource": ["arn:aws:iot:%s:%s:topic/Request"]
                    },
                    {
                        "Effect": "Allow",
                        "Action": [
                            "iot:Subscribe"
                        ],
                        "Resource": ["arn:aws:iot:%s:%s:topicfilter/Response"]
                    },
                    {
                        "Effect": "Allow",
                        "Action": [
                            "iot:Receive"
                        ],
                        "Resource": ["arn:aws:iot:%s:%s:topic/Response"]
                    },
                    {
                        "Effect": "Allow",
                        "Action": ["iot:Connect"],
                        "Resource": ["*"]
                    }
                ]
            }
        '''%(awsRegion, awsAccount, awsRegion, awsAccount, awsRegion, awsAccount)
        pattern = re.compile(r'[\s\r\n]+')
        policyDocumentStr = re.sub(pattern, '', policyDocumentStr)
    
        response = client.create_policy(
            policyName = thingPolicy,
            policyDocument = policyDocumentStr
        )
        if 200 != response['ResponseMetadata']['HTTPStatusCode']:
            eprint(Fore.RED + "ERROR: Unable to 'create_thing_type' " + Style.RESET_ALL)
            sys.exit(1)
        print(Fore.GREEN + "Created new policy '" + thingPolicy + "'" +
                Style.RESET_ALL)
    
    except ClientError as e:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
        eprint(Fore.RED + "ERROR in " + fname + ':' + str(exc_tb.tb_lineno) + ' - ' + e.response['Error']['Code'] + ' - ' + e.response['Error']['Message'] + Style.RESET_ALL)
        sys.exit(1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-16
      • 2022-11-15
      • 2021-09-21
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多