AWS App Runner を CLI から試す
(この記事は以前某所で掲載していた内容のお引越し記事です。)
既に各所で話題ですが、 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