50代アプリエンジニアのAWS学習日記

50代からの学び直しブログ

SNSトピックのアクセスポリシーの謎が解けない。→解けた!

今日の積み上げ

  • SOA対策本 模擬試験(ラボ問題)2-1

 

今日はS3のラボ問題をやってみました。

S3オブジェクトの削除イベントをSNSに通知するために、

  1. SNSトピックを作成
  2. SNSのアクセスポリシーを変更(S3をPubusisherとして許可)
  3. S3のイベント通知を作成

の手番を踏む必要があるんですが、2の変更のやり方がわからず、詰まりました。。

 

対策本の解説では、アクセスポリシーのCondition要素の下記のように修正する、となっており、やってみたけど、どうにもうまくいかない。。

SNSアクセスポリシーの保存はできるんですが、S3イベント通知の作成でエラーになってしまう)

"ArnLike": {"aws:SourceArn": "arn:aws:s3:*:*:bucket-name" }

 

ちなみに、SNSトピックを作成した際のデフォルトのアクセスポリシーは下記の通り。

{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__default_statement_ID",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "SNS:GetTopicAttributes",
        "SNS:SetTopicAttributes",
        "SNS:AddPermission",
        "SNS:RemovePermission",
        "SNS:DeleteTopic",
        "SNS:Subscribe",
        "SNS:ListSubscriptionsByTopic",
        "SNS:Publish"
      ],
      "Resource": "SNS-topic-ARN",
      "Condition": {
        "StringEquals": {
          "AWS:SourceOwner": "bucket-owner-account-id"
        }
      }
    }
  ]
}

 

 

しょうがないので、公式ドキュメントを調べてみることに。

docs.aws.amazon.com

下記ポリシーをコピペして、赤字箇所を自分用に修正したところ、無事イベント通知の作成まで完了することができました。

{
    "Version": "2012-10-17",
    "Id": "example-ID",
    "Statement": [
        {
            "Sid": "Example SNS topic policy",
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": [
                "SNS:Publish"
            ],
            "Resource": "SNS-topic-ARN",
            "Condition": {
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:s3:*:*:bucket-name"
                },
                "StringEquals": {
                    "aws:SourceAccount": "bucket-owner-account-id"
                }
            }
        }
    ]
}    

 

うまくいったのはよかったんですが、これ、何のヒントもなく本試験で出されたら、即アウトだなぁと思いました。

(何が悪くてうまくいかなかったのか、までは究明できていません)

SOA試験でこのレベルまで求められてしまうと、ほんとに実務レベルでやっていないと太刀打ちできそうにない感じがしてしまうのは気のせいですかね。

ま、ここを乗り切れるかどうか、試練の時なんでしょうね。

今日のところは、いい問題に巡り合えた、と前向きに捉えていこうと思います。

 

明日は引き続き、ラボ問題2-2のAWS Backupをやってみようと思います。

それでは、また明日!

 

 

[ 事後記載 2022/7/6 0:10 ]

謎が解けました!

Principal要素について、よく理解できていなかったことが原因でした。

"AWS":"*" → これはAWSアカウントがPublisher

"Service":service-name.amazonaws.com → これは赤字のAWSサービスがPublisher

つまり、Principal要素がS3サービスとしてアクセスポリシーを定義しないと、効力を発揮しないということ。

最初、うまくいかなかったのは、Principal要素がAWSアカウントとなっているポリシーのConditionに追加していたのが原因。(わかって振り返ると、なるほど納得って感じ)

 

謎解きにあたり、参考にした記事はこちら。

blog.interstellar.co.jp

docs.aws.amazon.com

 

これで心置きなく眠れる~