2020年末日に廃止が告知されていたAmazon CloudFront RTMPディストリビューションの2021年冒頭の状況を確認してみた

Adobe Flashを使ったストリーミング動画配信を長年支えてきたAmazon CloudFrontのRTMPディストリビューション、2020年12月31日の廃止にあたり、その勇退する瞬間を目撃しようと試みました。
2021.01.05

はじめに

清水です。Adobe Flashのサポート終了にあわせて、Amazon CloudFrontのRTMPディストリビューションが廃止(deprecate)されることが予告されていました。AWS Developer Forumsでおよそ1年前にポストされていた内容です。

本Developers.IOでも以下エントリにて取り上げていました。

本エントリでは、廃止予定の2020年12月31日を過ぎたあと、CloudFrontのRTMPディストリビューションがどのようになったのか確認したのでまとめてみます。AWSとしては珍しいサービス停止の瞬間に立ち会うことはできたのでしょうか!?なお確認した環境については、日常的にRTMPディストリビューションを使用している環境ではなく、検証として以前(2020年中に)構築したCloudFrontディストリビューションが残っていた、ぐらいの使用頻度です。すべての環境で同様の挙動となっているかはわかりません。あくまで私が観測した範囲での内容となる点、ご了承ください。

2021/01/16 追記

2020年末日に廃止となったのは、あくまでAmazon CloudFrontを用いたラストマイルでのRTMPの利用であり、AWSの他サービスにおけるファーストマイルのRTMPでの使用は2021年冒頭でも現役となります。

予告されていたRTMPディストリビューション廃止時の動作

まずは廃止が予告されていたAWS Developer Forumで、2020年12月31日以降にRTMPディストリビューションがどのように扱われるかアナウンスされていた内容を確認しておきます。詳細は原文をご参照ください。抜粋すると以下となります。

  • すべてのCloudFront RTMPディストリビューションが削除される
    • 「all CloudFront RTMP distributions will be deleted」
  • CloudFrontは存在していたエンドポイントへのリクエストを拒否する
    • 「CloudFront will deny requests made to those previously existing endpoints」

これを読んで、廃止のタイミングでAWSマネジメントコンソールなどからRTMPディストリビューションが参照できなくなるイメージを持ちました。(削除される、とのことから。)

廃止前2020年12月31日(JST)の状況

紅白歌合戦も終盤に差し掛かった2020年12月31日22時過ぎ(日本時間)、マネジメントコンソールやAWS CLIを使ってリソースの状況を確認してみました。当たり前ながら廃止される前の状況となります。

AWSマネジメントコンソールからリソースの一覧を確認してみます。わかりやすいようにDelivery MethodをRTMPにして絞り込んでみましょう。

2つのRTMPディストリビューションが確認できます。

ひとつはStateがEnableのもの、もうひとつはDisabledです。たしかRTMPディストリビューション廃止予告のブログエントリを書いたときに作成したものだったかと思います。

なお[Create Distribution]ボタンで進むと、最初にディストリビューション選択画面が現れます。RTMPディストリビューション廃止のお知らせも確認できますね。

AWS CLIでもcloudfront list-streaming-distributionsコマンドやcloudfront get-streaming-distributionコマンド、cloudfront get-streaming-distribution-configコマンドを使って確認してみます。以下のようにディストリビューション情報が取得できます。

% aws cloudfront list-streaming-distributions
{
    "StreamingDistributionList": {
        "Items": [
            {
                "Id": "EYZJIXXXXXXXX",
                "ARN": "arn:aws:cloudfront::123456789012:streaming-distribution/EYZJIXXXXXXXX",
                "Status": "Deployed",
                "LastModifiedTime": "2020-12-31T12:18:29.841000+00:00",
                "DomainName": "s2c8byxxxxxxxx.cloudfront.net",
                "S3Origin": {
                    "DomainName": "my-s3-bucket.s3.amazonaws.com",
                    "OriginAccessIdentity": ""
                },
                "Aliases": {
                    "Quantity": 0
                },
                "TrustedSigners": {
                    "Enabled": false,
                    "Quantity": 0
                },
                "Comment": "RTMP",
                "PriceClass": "PriceClass_All",
                "Enabled": true
            },
            {
                "Id": "ETSEOXXXXXXXX",
                "ARN": "arn:aws:cloudfront::123456789012:streaming-distribution/ETSEOXXXXXXXX",
                "Status": "Deployed",
                "LastModifiedTime": "2020-07-10T11:13:50.737000+00:00",
                "DomainName": "s2gjpcxxxxxxxx.cloudfront.net",
                "S3Origin": {
                    "DomainName": "my-s3-bucket.s3.ap-northeast-1.amazonaws.com",
                    "OriginAccessIdentity": ""
                },
                "Aliases": {
                    "Quantity": 0
                },
                "TrustedSigners": {
                    "Enabled": false,
                    "Quantity": 0
                },
                "Comment": "",
                "PriceClass": "PriceClass_All",
                "Enabled": false
            }
        ]
    }
}
% aws cloudfront get-streaming-distribution --id EYZJIXXXXXXXX
{
    "ETag": "E252VX8IQ1KBJI",
    "StreamingDistribution": {
        "Id": "EYZJIXXXXXXXX",
        "ARN": "arn:aws:cloudfront::123456789012:streaming-distribution/EYZJIXXXXXXXX",
        "Status": "Deployed",
        "LastModifiedTime": "2020-12-31T12:18:29.841000+00:00",
        "DomainName": "s2c8byxxxxxxxx.cloudfront.net",
        "ActiveTrustedSigners": {
            "Enabled": false,
            "Quantity": 0
        },
        "StreamingDistributionConfig": {
            "CallerReference": "1585560342617",
            "S3Origin": {
                "DomainName": "my-s3-bucket.s3.amazonaws.com",
                "OriginAccessIdentity": ""
            },
            "Aliases": {
                "Quantity": 0
            },
            "Comment": "RTMP",
            "Logging": {
                "Enabled": false,
                "Bucket": "",
                "Prefix": ""
            },
            "TrustedSigners": {
                "Enabled": false,
                "Quantity": 0
            },
            "PriceClass": "PriceClass_All",
            "Enabled": true
        }
    }
}
 % aws cloudfront get-streaming-distribution-config --id EYZJIXXXXXXXX
{
    "ETag": "E252VX8IQ1KBJI",
    "StreamingDistributionConfig": {
        "CallerReference": "1585560342617",
        "S3Origin": {
            "DomainName": "my-s3-bucket.s3.amazonaws.com",
            "OriginAccessIdentity": ""
        },
        "Aliases": {
            "Quantity": 0
        },
        "Comment": "RTMP",
        "Logging": {
            "Enabled": false,
            "Bucket": "",
            "Prefix": ""
        },
        "TrustedSigners": {
            "Enabled": false,
            "Quantity": 0
        },
        "PriceClass": "PriceClass_All",
        "Enabled": true
    }
}
% aws cloudfront get-streaming-distribution --id ETSEOXXXXXXXX
{
    "ETag": "E17UOZHMWYR7Y",
    "StreamingDistribution": {
        "Id": "ETSEOXXXXXXXX",
        "ARN": "arn:aws:cloudfront::123456789012:streaming-distribution/ETSEOXXXXXXXX",
        "Status": "Deployed",
        "LastModifiedTime": "2020-07-10T11:13:50.737000+00:00",
        "DomainName": "s2gjpcxxxxxxxx.cloudfront.net",
        "ActiveTrustedSigners": {
            "Enabled": false,
            "Quantity": 0
        },
        "StreamingDistributionConfig": {
            "CallerReference": "1585743736956",
            "S3Origin": {
                "DomainName": "my-s3-bucket.s3.ap-northeast-1.amazonaws.com",
                "OriginAccessIdentity": ""
            },
            "Aliases": {
                "Quantity": 0
            },
            "Comment": "",
            "Logging": {
                "Enabled": false,
                "Bucket": "",
                "Prefix": ""
            },
            "TrustedSigners": {
                "Enabled": false,
                "Quantity": 0
            },
            "PriceClass": "PriceClass_All",
            "Enabled": false
        }
    }
}
% aws cloudfront get-streaming-distribution-config --id ETSEOXXXXXXXX
{
    "ETag": "E17UOZHMWYR7Y",
    "StreamingDistributionConfig": {
        "CallerReference": "1585743736956",
        "S3Origin": {
            "DomainName": "my-s3-bucket.s3.ap-northeast-1.amazonaws.com",
            "OriginAccessIdentity": ""
        },
        "Aliases": {
            "Quantity": 0
        },
        "Comment": "",
        "Logging": {
            "Enabled": false,
            "Bucket": "",
            "Prefix": ""
        },
        "TrustedSigners": {
            "Enabled": false,
            "Quantity": 0
        },
        "PriceClass": "PriceClass_All",
        "Enabled": false
    }
}

新年を迎えた直後の状況

日本時間で新年を迎え少しした2021年1月1日午前1時過ぎ、まぁグローバルなリソースだし、日本時間で2021年になったからといってリソースがなくなることはないよな、と思いながらも念のため確認してみました。

結果だけまとめると、2020年12月31日(JST)と同様の挙動で、AWSマネジメントコンソール、AWS CLIいずれでも情報取得が可能でした。これは太平洋標準時(PST)で新年を迎えた日本時間2021年1月1日午後7時過ぎでも同様でした。

後述しますが、このリソースが参照できている(削除されていない)ということで、私はRTMPディストリビューションがまだ廃止されていない、と思い込んでしまっていました。

2021年1月5日の状況。情報取得以外の挙動も確認すると……

以降もふと思い出したタイミングで、AWSマネジメントコンソールからRTMPディストリビューションが参照できるか確認してみましたが、特にリソースが消えるということはないようでした。んん?と思い、ふと[Create Distribution]でRTMPディストリビューションを作成しようとしてみます。2021/01/05 午前10時台の確認でした。

RTMPディストリビューションの作成

いまだにRTMPディストリビューションの選択はできそうです。RTMPディストリビューションの[Get Started]ボタンから進みます。

Origin Domain NameでS3バケットを選択、他の項目はデフォルト設定のままとし[Create Distribution]でディストリビューションを作成しようとしてみます。が!以下のようなエラーが表示されてしまいました。

com.amazonaws.AmazonServiceException: Rate exceeded (Service: AmazonCloudFront; Status Code: 400; Error Code: Throttling; Request ID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX; Proxy: null)

AWS CLIでもcloudfront create-streaming-distributionコマンドを実行してみます。 こちらもエラーが返ってくるようでした。

% cat config.json                                                              {
    "StreamingDistributionConfig": {
        "CallerReference": "1609834912",
        "S3Origin": {
            "DomainName": "my-s3-bucket.s3.amazonaws.com",
            "OriginAccessIdentity": ""
        },
        "Comment": "",
        "Logging": {
            "Enabled": false,
            "Bucket": "",
            "Prefix": ""
        },
        "TrustedSigners": {
            "Enabled": true,
            "Quantity": 0,
            "Items": [
                ""
            ]
        },
        "PriceClass": "PriceClass_All",
        "Enabled": true
    }
}

% aws cloudfront create-streaming-distribution --cli-input-json file://config.json

An error occurred (Throttling) when calling the CreateStreamingDistribution operation (reached max retries: 2): Rate exceeded

ということでおそらく、現段階(2021/01/05時点)で新規のRTMPディストリビューションの作成はできないようになっているかと思われます。

RTMPディストリビューションの設定変更

新規のRTMPディストリビューションの作成はできなさそうでしたが、既存のRTMPディストリビューションの設定変更についてはどうでしょうか。StatusをDisabledにしていたRTMPディストリビューションがひとつありましたので、これをEnabledにしてみました。こちらは特にエラーなど発生せず、設定変更ができました。

 % aws cloudfront get-streaming-distribution --id ETSEOXXXXXXXX
{
    "ETag": "E3U5ZPRH7LB69P",
    "StreamingDistribution": {
        "Id": "ETSEOXXXXXXXX",
        "ARN": "arn:aws:cloudfront::123456789012:streaming-distribution/ETSEOXXXXXXXX",
        "Status": "Deployed",
        "LastModifiedTime": "2021-01-05T01:35:02.983000+00:00",
        "DomainName": "s2gjpcxxxxxxxx.cloudfront.net",
        "ActiveTrustedSigners": {
            "Enabled": false,
            "Quantity": 0
        },
        "StreamingDistributionConfig": {
            "CallerReference": "1585743736956",
            "S3Origin": {
                "DomainName": "my-s3-bucket.s3.ap-northeast-1.amazonaws.com",
                "OriginAccessIdentity": ""
            },
            "Aliases": {
                "Quantity": 0
            },
            "Comment": "",
            "Logging": {
                "Enabled": false,
                "Bucket": "",
                "Prefix": ""
            },
            "TrustedSigners": {
                "Enabled": false,
                "Quantity": 0
            },
            "PriceClass": "PriceClass_All",
            "Enabled": true
        }
    }
}

RTMPディストリビューションとの接続を確認してみる

リソースの作成はできないけど、既存のRTMPディストリビューション自体はまだ使える状態なのかな?(エンドポイントへのリクエストは拒否する、ということだったけれど)、ということで、RTMPディストリビューションへの接続確認をしてみます。動画プレイヤーからの再生確認ができればベストなのですが準備ができなかったため、ncコマンドでの接続確認をまず行ってみます。

% nc -zv s2c8byxxxxxxxx.cloudfront.net 1935
nc: getaddrinfo: nodename nor servname provided, or not known
% nc -zv s2gjpcxxxxxxxx.cloudfront.net 1935
nc: getaddrinfo: nodename nor servname provided, or not known

接続成功とはなりません。(接続成功すれば、「Connection to ~ succeeded!」といった内容が返るはずです。)

名前解決結果を確認してみる

ncコマンドでの接続失敗を受けて、名前解決結果が気になりました。digコマンドで確認します。

% dig s2c8byxxxxxxxx.cloudfront.net

; <<>> DiG 9.10.6 <<>> s2c8byxxxxxxxx.cloudfront.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23314
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;s2c8byxxxxxxxx.cloudfront.net. IN      A

;; AUTHORITY SECTION:
cloudfront.net.         60      IN      SOA     ns-418.awsdns-52.com. hostmaster.cloudfront.net. 1377556270 16384 2048 1048576 60

;; Query time: 18 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue Jan 05 19:52:53 JST 2021
;; MSG SIZE  rcvd: 125
% dig s2gjpcxxxxxxxx.cloudfront.net

; <<>> DiG 9.10.6 <<>> s2gjpcxxxxxxxx.cloudfront.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16541
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;s2gjpcxxxxxxxx.cloudfront.net. IN      A

;; AUTHORITY SECTION:
cloudfront.net.         60      IN      SOA     ns-418.awsdns-52.com. hostmaster.cloudfront.net. 1377556270 16384 2048 1048576 60

;; Query time: 13 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue Jan 05 19:53:02 JST 2021
;; MSG SIZE  rcvd: 125

応答は返ってきましたが、ANSWERセクションがありません。ざっと確認してみたところ *1、DNSまわりのトラブルなどでこのような状況になることがあるようですが、RTMPディストリビューション廃止ということで名前解決が正常にできないのではないか、と推測しています。

まとめ

2020年末日に廃止が告知されていてAmazon CloudFrontのRTMPディストリビューションについて、年末から2021年冒頭、1月5日時点での状況を確認してみました。AWSマネジメントコンソールやAWS CLIなどで既存リソースの確認はできますが、新規リソース作成は不可のようです。またcloudfront.netドメインの名前解決も正常にできていないようで、実際にはクライアントからRTMPディストリビューションに接続できない状況かと推測します。あくまでAWSの公式発表などではなく、私が観測した範囲ですが、RTMPディストリビューションの廃止はこのように実施されていました。個人的な反省としてはディストリビューション(リソース)の削除にばかり気を取られていて、エンドポイント自体の接続などは確認できていなかったことです。2021年のいつごろから名前解決ができなくなっていたのか、気になるところでした。

脚注