lambdaを使ってSNSのアクセスポリシーを取得、変更、更新したいのですが、更新の部分set_topic_attributesが上手くいきません
解決方法を教えて頂きたいです。
py
1import os 2import boto3 3import json 4import ast 5 6import logging 7logger = logging.getLogger() 8logger.setLevel(logging.INFO) 9 10topic_arn = os.environ['topic_arn'] 11account_no = os.environ['account_no'] 12 13sns_client = boto3.client('sns') 14 15def lambda_handler(event, context): 16 17 # snsポリシー取得 18 sns_policy = get_sns_policy(sns_client, topic_arn) 19 print('sns_policy:',sns_policy) 20 21 if sns_policy != 'policy_not_exist': 22 # ポリシーの中に'S3-Events'があるかチェック 23 check_policy_result = check_policy(sns_policy) 24 print('check_policy_result:',check_policy_result) 25 26 if not check_policy_result: 27 # snsポリシー修正 28 new_sns_policy = mod_sns_policy(sns_policy, topic_arn, account_no) 29 print('new_sns_policy:',new_sns_policy) 30 31 # 修正したポリシーをsnsにアプデ 32 update_sns_policy(sns_client, new_sns_policy, topic_arn) 33 34 35 36 37def get_sns_policy(sns_client, topic_arn): 38 try: 39 response = sns_client.get_topic_attributes(TopicArn=topic_arn) 40 return ast.literal_eval(response['Attributes']['Policy']) 41 except Exception: 42 return 'policy_not_exist' 43 44 45def check_policy(sns_policy): 46 print(type(sns_policy)) 47 s3_events_flg = False 48 for statement in sns_policy['Statement']: 49 # キー"Sid"がある場合 かつ 値が "S3-Events"の場合 50 if "Sid" in statement.keys() and statement["Sid"] == "S3-Events": 51 print('S3-Events Yes it is') 52 s3_events_flg = True 53 return s3_events_flg 54 else: print('S3-Events No it isnt') 55 return s3_events_flg 56 57 58def mod_sns_policy(sns_policy, topic_arn, account_no): 59 print('mod_sns_policy_function') 60 61 new_statement = { 62 "Sid": "S3-Events","Effect": "Allow", 63 "Principal": {"Service": "s3.amazonaws.com"}, 64 "Action": "sns:Publish", 65 "Resource": topic_arn, 66 "Condition": {"StringEquals": { "AWS:SourceAccount": account_no }} 67 } 68 sns_policy['Statement'].append(new_statement) 69 70 return sns_policy 71 72 73def update_sns_policy(sns_client, new_sns_policy, topic_arn): 74 print('update_sns_policy_function') 75 76 jsondumps_new_sns_policy = json.dumps(new_sns_policy) 77 str_new_sns_policy = str(new_sns_policy) 78 79 try: 80 sns_client.set_topic_attributes( 81 TopicArn=topic_arn, 82 AttributeName='DeliveryPolicy', 83 AttributeValue=str_new_sns_policy 84 ) 85 except Exception as e: 86 logger.error(e)
Lambda設定
- ライタイム:Python 3.9
- アーキテクチャ:x86_64
試したこと
sns_client.set_topic_attributes()
のAttributeValue=
に入る部分を、json.dumpsやstrなどの形に変換して試してみました。
new_sns_policy
(pythonのdict形式のまま)の場合
[ERROR] 2022-03-20T12:57:40.342Z 11dd47c8-2cb7-4240-a382-74a016619469 Parameter validation failed: Invalid type for parameter AttributeValue, value: { ポリシー の中身(割愛) }, type: <class 'dict'>, valid types: <class 'str'>
json.dumps(new_sns_policy)
の場合
[ERROR] 2022-03-20T12:25:00.778Z eac745dd-e649-492d-b551-bab8bb62fcb6 An error occurred (InvalidParameter) when calling the SetTopicAttributes operation: Invalid parameter: DeliveryPolicy: Unexpected JSON member: Version
str(new_sns_policy)
の場合
[ERROR] 2022-03-20T12:54:13.830Z 404be517-147f-4fe8-929a-6788049c068c An error occurred (InvalidParameter) when calling the SetTopicAttributes operation: Invalid parameter: DeliveryPolicy: Invalid JSON: Unexpected character (''' (code 39)) at [line: 1, column: 3]: was expecting double-quote to start field name

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。