質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1489閲覧

LambdaでSNSアクセスポリシーを更新できない

teltel07

総合スコア42

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/03/20 13:07

編集2022/03/20 13:50

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。
SNSアクセスポリシーを更新したい場合、AttributeNameは「Policy」が正しかった。お騒がせしました。


AttributeName='DeliveryPolicy'

AttributeName='Policy'

投稿2022/03/22 02:59

teltel07

総合スコア42

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問