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

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

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

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

SNS

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

Python

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

解決済

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

teltel07
teltel07

総合スコア42

AWS Lambda

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

SNS

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

Python

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

1回答

0評価

0クリップ

449閲覧

投稿2022/03/20 13:07

編集2022/03/22 11:59

lambdaを使ってSNSのアクセスポリシーを取得、変更、更新したいのですが、更新の部分set_topic_attributesが上手くいきません
解決方法を教えて頂きたいです。

py

import os import boto3 import json import ast import logging logger = logging.getLogger() logger.setLevel(logging.INFO) topic_arn = os.environ['topic_arn'] account_no = os.environ['account_no'] sns_client = boto3.client('sns') def lambda_handler(event, context): # snsポリシー取得 sns_policy = get_sns_policy(sns_client, topic_arn) print('sns_policy:',sns_policy) if sns_policy != 'policy_not_exist': # ポリシーの中に'S3-Events'があるかチェック check_policy_result = check_policy(sns_policy) print('check_policy_result:',check_policy_result) if not check_policy_result: # snsポリシー修正 new_sns_policy = mod_sns_policy(sns_policy, topic_arn, account_no) print('new_sns_policy:',new_sns_policy) # 修正したポリシーをsnsにアプデ update_sns_policy(sns_client, new_sns_policy, topic_arn) def get_sns_policy(sns_client, topic_arn): try: response = sns_client.get_topic_attributes(TopicArn=topic_arn) return ast.literal_eval(response['Attributes']['Policy']) except Exception: return 'policy_not_exist' def check_policy(sns_policy): print(type(sns_policy)) s3_events_flg = False for statement in sns_policy['Statement']: # キー"Sid"がある場合 かつ 値が "S3-Events"の場合 if "Sid" in statement.keys() and statement["Sid"] == "S3-Events": print('S3-Events Yes it is') s3_events_flg = True return s3_events_flg else: print('S3-Events No it isnt') return s3_events_flg def mod_sns_policy(sns_policy, topic_arn, account_no): print('mod_sns_policy_function') new_statement = { "Sid": "S3-Events","Effect": "Allow", "Principal": {"Service": "s3.amazonaws.com"}, "Action": "sns:Publish", "Resource": topic_arn, "Condition": {"StringEquals": { "AWS:SourceAccount": account_no }} } sns_policy['Statement'].append(new_statement) return sns_policy def update_sns_policy(sns_client, new_sns_policy, topic_arn): print('update_sns_policy_function') jsondumps_new_sns_policy = json.dumps(new_sns_policy) str_new_sns_policy = str(new_sns_policy) try: sns_client.set_topic_attributes( TopicArn=topic_arn, AttributeName='DeliveryPolicy', AttributeValue=str_new_sns_policy ) except Exception as e: 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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

AWS Lambda

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

SNS

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

Python

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