📝

AWS App Runner を CLI から試す

2021/12/12に公開

(この記事は以前某所で掲載していた内容のお引越し記事です。)
既に各所で話題ですが、 2021 年 5 月 18 日に、マネージドなウェブアプリのデプロイサービス(で良いのかな)、App Runner が AWS からリリースされました。n番煎じになりそうですが、この記事では、AWS CLI から App Runner を試してみます。

リリースノート

余談になりますが、AWS の ドキュメントで、AppRunner に関するリリースノートがまとまっていました。

(2021年12月12日時点では)日本語版だと、GA (一般公開時) のリリースノートしか見られませんが、英語版であれば、以下2件のアップデートについても記載されています。

前者では、AppRunner の開発や使い勝手、安定性に関する複数のアップデートがあったことがまとめられています。
後者の UPDATE については、こちらの記事 [アップデート]Amazon ECR Publicから直接AWS App Runnerでコンテナ起動できるようになりました で触れられていますね。

他のサービスでも、このような「リリースノート」で、更新履歴が手繰れると、「しばらく目を離していた隙に、こんな機能改善が…」といった浦島太郎状態の解消の助けになりそうで、親切なドキュメントだと感じました。

(多少調べてみたのですが、リリースノートを纏めて下さった AWSサービスのドキュメント履歴・リリースノート・フォーラムまとめ といった記事もあったものの、現状、リリースノート の有無は、AWS のサービスによってまちまちのように感じます。 もし何かご存じの方が居たらお教え頂ければ嬉しいです。)

バージョン

なお、本記事投稿初回作成時点 で最新の AWS CLI v2 系 では、App Runner がまだサポートされていないため、v1 系 の AWS CLI で試しています。じきに v2 系 にも App Runner のサポートがマージされると思いますが、おそらく v1 と似た手順で使えるものと思われます。v1 系 では、1.19.75 で App Runner への対応が取り込まれています。

C:\Users\yoichi> aws --version
aws-cli/1.19.78 Python/3.6.0 Windows/10 botocore/1.20.78 

2020年6月追記

その後、v2 系でも 2.2.6 で無事に App Runner への対応が取り込まれました。無理に v1 系を使わずとも、お手元や Cloud Shell の aws cli を更新すれば App Runner できると思われます!

事前準備

まず、create-service で、サービスを作成してみます。ただし、その前に、設定ファイルが必要です。
下記内容のファイルに、apprunner.json と 名前を付けて 保存します。

{
  "ImageRepository": {
    "ImageIdentifier": "public.ecr.aws/nginx/nginx:latest",
    "ImageConfiguration": {
      "Port": "80"
    },
    "ImageRepositoryType": "ECR_PUBLIC"
  },
  "AutoDeploymentsEnabled": false
}

今回は、他の諸先輩方の例同様に、ECR の Public リポジトリから、素の nginx コンテナをデプロイすることを想定しています。
ファイルからのパラメータインポートについては、こちらを参照下さい。リファレンス には、RuntimeEnvironmentVariables、StartCommand などのパラメータもあり、環境変数や 起動コマンドを コンテナに渡すこともできそうです。
なお、マネジメントコンソールで指定する内容と見比べると 一見、AutoDeploymentsEnabled パラメータは不要に思えますが、設定なし または true の場合、デプロイに失敗したため、コンテナイメージからのデプロイの場合は、false での設定が必須のようです。

create-service

さて、用意した ファイルを読み込み、以下のコマンドでサービスを開始します。

aws apprunner create-service --service-name nginx --source-configuration file://./apprunner.json --instance-configuration Cpu="1 vCPU",Memory="2 GB"

なお、--instance-configuration オプションは必須ではありません。デフォルトで、1 vCPU、2 GB が割当てられます。ちなみに、単に "1"、"2" などと指定した場合も エラーになります。書式については、リファレンス を参照下さい。
結果として、作成されたサービスの内容が出力されます。

{
    "Service": {
        "ServiceName": "nginx",
        "ServiceId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "ServiceArn": "arn:aws:apprunner:ap-northeast-1:999999999999:service/nginx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "ServiceUrl": "xxxxxxxxxx.ap-northeast-1.awsapprunner.com",
        "CreatedAt": 1621691194.784,
        "UpdatedAt": 1621691194.784,
        "Status": "OPERATION_IN_PROGRESS",
        "SourceConfiguration": {
            "ImageRepository": {
                "ImageIdentifier": "public.ecr.aws/nginx/nginx:latest",
                "ImageConfiguration": {
                    "Port": "80"
                },
                "ImageRepositoryType": "ECR_PUBLIC"
            },
            "AutoDeploymentsEnabled": false
        },
        "InstanceConfiguration": {
            "Cpu": "1024",
            "Memory": "2048"
        },
        "HealthCheckConfiguration": {
            "Protocol": "TCP",
            "Path": "/",
            "Interval": 5,
            "Timeout": 2,
            "HealthyThreshold": 1,
            "UnhealthyThreshold": 5
        },
        "AutoScalingConfigurationSummary": {
            "AutoScalingConfigurationArn": "arn:aws:apprunner:ap-northeast-1:999999999999:autoscalingconfiguration/DefaultConfiguration/1/00000000000000000000000000000001",
            "AutoScalingConfigurationName": "DefaultConfiguration",
            "AutoScalingConfigurationRevision": 1
        }
    },
    "OperationId": "00000000000000000000000000000000"
}

list-services

次に、サービスが作成されているか、list-services で確認してみます。
(レスポンスが返ってきている以上、作成されているハズなのですが)

aws apprunner list-services

実行結果は以下の通りです。

{
    "ServiceSummaryList": [
        {
            "ServiceName": "nginx",
            "ServiceId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "ServiceArn": "arn:aws:apprunner:ap-northeast-1:999999999999:service/nginx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "ServiceUrl": "xxxxxxxxxx.ap-northeast-1.awsapprunner.com",
            "CreatedAt": 1621691194.0,
            "UpdatedAt": 1621691194.0,
            "Status": "OPERATION_IN_PROGRESS"
        }
    ]
}

ステータスもこのCLIで確認できますね。
複数のサービスを一覧で見たい場合、フィルタを通したほうが良いかもしれません。

$ aws apprunner list-services --query "ServiceSummaryList[*].{A:ServiceName,B:Status}" --output text
nginx   OPERATION_IN_PROGRESS

describe-service

サービスの詳細を確認するには、describe-service です。

aws apprunner describe-service --service-arn "arn:aws:apprunner:ap-northeast-1:999999999999:service/nginx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

結果は、create-service で出力されたものと同等の 詳細が出力されます。
サービスが作成されるまで、数分待つ必要がありますが、作成されると、ServiceUrl の URL から、サービスにアクセスすることができます。

pause-service / resume-service

pause-service で、サービスを一時停止することができます。

aws apprunner pause-service --service-arn "arn:aws:apprunner:ap-northeast-1:999999999999:service/nginx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

停止すると、(当然ですが) サイトにアクセスすることはできません。

再開するには、resume-service です。

aws apprunner resume-service --service-arn "arn:aws:apprunner:ap-northeast-1:999999999999:service/nginx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

少々待つと、元のサービスにアクセスできるようになりました。

update-service

update-service で、サービスを更新することができます。

例えば、変更前の設定は、1 vCPU 2GB メモリです。

aws apprunner update-service --service-arn "arn:aws:apprunner:ap-northeast-1:999999999999:service/nginx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" --instance-configuration Cpu="2 vCPU",Memory="4 GB"

変更後は設定は、2 vCPU 4GB メモリになりました。

ちなみに、やや意外でしたが、 pause 状態の場合、更新ができないようです。
サービスが稼働している状態で update する必要があります。

list-operations

App Runner のサービスに対して実行した操作を、list-operations で一覧できます。

aws apprunner list-operations --service-arn "arn:aws:apprunner:ap-northeast-1:999999999999:service/nginx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

実行結果は、以下のようになります。

{
    "OperationSummaryList": [
        {
            "Id": "00000000000000000000000000000000",
            "Type": "UPDATE_SERVICE",
            "Status": "SUCCEEDED",
            "TargetArn": "arn:aws:apprunner:ap-northeast-1:999999999999:service/nginx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "StartedAt": 1621691786.0,
            "EndedAt": 1621691884.0,
            "UpdatedAt": 1621691884.0
        },
        {
            "Id": "11111111111111111111111111111111",
            "Type": "RESUME_SERVICE",
            "Status": "SUCCEEDED",
            "TargetArn": "arn:aws:apprunner:ap-northeast-1:999999999999:service/nginx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "StartedAt": 1621691705.0,
            "EndedAt": 1621691771.0,
            "UpdatedAt": 1621691771.0
        },
        {
            "Id": "22222222222222222222222222222222",
            "Type": "PAUSE_SERVICE",
            "Status": "SUCCEEDED",
            "TargetArn": "arn:aws:apprunner:ap-northeast-1:999999999999:service/nginx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "StartedAt": 1621691538.0,
            "EndedAt": 1621691572.0,
            "UpdatedAt": 1621691572.0
        },
        {
            "Id": "33333333333333333333333333333333",
            "Type": "CREATE_SERVICE",
            "Status": "SUCCEEDED",
            "TargetArn": "arn:aws:apprunner:ap-northeast-1:999999999999:service/nginx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "StartedAt": 1621691194.0,
            "EndedAt": 1621691500.0,
            "UpdatedAt": 1621691500.0
        }
    ]
}

マネジメントコンソールで確認できるのと同様の内容が確認できそうです。

delete-service

最後に、サービスの削除は、delete-serviceです。

aws apprunner delete-service --service-arn "arn:aws:apprunner:ap-northeast-1:999999999999:service/nginx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

実施すると、 App Runner のサービスが、綺麗に無くなります。

$ aws apprunner list-operations --service-arn "arn:aws:apprunner:ap-northeast-1:999999999999:service/nginx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

An error occurred (ResourceNotFoundException) when calling the ListOperations operation: No Services found for the provided arn: arn:aws:apprunner:ap-northeast-1:999999999999:service/nginx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.

list-operations による操作ログの確認もできなくなってしまったので、もし、継続的に利用するアプリケーションであれば、 delete するよりも、一時的に pause しておくほうが良い場面もありそうです。
ただし、delete-service した後も、CloudWatch Logs の ログは削除されなかったため、そちらのほうから、サービスの状態を確認することは不可能ではないかもしれません。
(対応するログを確認しづらいなど、不都合はありそうですが)

ちなみに、CloudWatch Logs の ログには、

/aws/apprunner/service-name/service-id/service

というロググループに出力されるサービスログと、

/aws/apprunner/service-name/service-id/application

というロググループに出力されるアプリケーションログがあります。
詳細は、こちら のリファレンスを参照下さい。

まとめ

AWS CLI で、コンテナイメージからの App Runner のデプロイを試してみました。
他の CLI も多数用意されているので、そのあたりも試してみたいものです。また、CloudWatch Logs の ログを見て、App Runner の構成などについて思い巡らせたことなどもあるので、それもまた別の機会があればまとめたいと思います(といって永遠にまとめないヤツ)。

Discussion