概要
EC2 Container Serviceを使うと、複数台のEC2をクラスタリングしてDockerコンテナが稼働するリソースプールとすることができて、おそらくリソースの偏りを気にしたりとか、Dockerのホストマシン側のポートの空きなどを判断して、適切なリソースをもったEC2上にコンテナを配備してくれる、といったものだと思います。。
が、使ったことがなくしょうじき全然わかっていないので、とりあえず試してみます。
用語について整理
そもそも用語が理解整理できていないのでまとめます。
Container instance (コンテナインスタンス) | コンテナを稼働させる基盤となるEC2インスタンス。ECRなどのコンテナレジストリからコンテナイメージを引っ張ってきてこの上で実行する。 |
Cluster (クラスタ) | コンテナインスタンスをクラスタリングしたもの。 |
Task (タスク) | コンテナインスタンス上で実行されているコンテナのこと(Container instanceはEC2を指し、コンテナはタスクと呼ぶ。みたいです。混乱します。"コンテナ" じゃだめだったのか。。)。 | Task Definitions | タスクとして稼働させるDockerイメージ名や開放するポート番号、CPU、Memoryリソースをどのくらい使用するか、どのボリュームをどこにマウントするかなどの定義。1つかそれ以上のタスクを含む。JSONで記述する。 |
Scheduler (スケジューラ) | 同時に複数のタスクを動かす場合、クラスタ内でリソースの開いているコンテナインスタンスを選んで起動させる、などの制御をする。 |
Service | Task Definitionを指定された数実行し、障害などでタスクが落ちた場合なども台数を維持したりするグループの単位。オートスケールやELBへの登録などもこの単位で管理される。 |
Container Agent | クラスタで稼働するEC2それぞれで動いており、稼働中のタスクやリソースの利用状況、タスクが開始・停止したなどの情報をECSの基盤へ送信している。 |
まとめるとこんな感じ?
動かしてみる
なんとなくわかってきましたので、以下のようなながれで動かしてみたいと思います。
おおまかな手順のながれです。
- Dockerレジストリの準備
Task Definitionで指定するDockerイメージは、ECRのものを使用することとし、予めレポジトリを作成します - Dockerイメージの準備
Dockerイメージは、nginxが入ったイメージとphp-fpmが入ったイメージを作成してlinkします。これらのイメージはECRに格納します - クラスタの作成
コンテナインスタンスはap-northeast-1a、ap-northeast-1cに1台ずつ起動します - ターゲットグループ、Application Load Balancerの作成
タスクを登録するターゲットグループを作成し、ALBへ登録します - Task Definitionsの作成
ECRからnginx、php-fpmのイメージを取得して起動するTask Definitionsを作成します - Serviceの作成
Task Definitionで定義した単位を10セット起動し、維持します - Application Load Balancerにアクセスして動作確認
作業内容
Dockerレジストリの準備
ECSのTask Definitionでは起動させるDockerイメージとして、Docker Hubのものと、プライベートリポジトリのものが使用できます。
今回はECRを利用します。
レジストリの作成と確認
nginx用のレポジトリと、php-fpm用のレポジトリの2つを作成します。今回はaws ciを使っています。
$ aws ecr create-repository --repository-name oreno/nginx --region ap-northeast-1
{
"repository": {
"registryId": "123456789012",
"repositoryName": "oreno/nginx",
"repositoryArn": "arn:aws:ecr:ap-northeast-1:123456789012:repository/oreno/nginx",
"repositoryUri": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/nginx"
}
}
$ aws ecr create-repository --repository-name oreno/php-fpm --region ap-northeast-1
{
"repository": {
"registryId": "123456789012",
"repositoryName": "php-fpm/nginx",
"repositoryArn": "arn:aws:ecr:ap-northeast-1:123456789012:repository/oreno/php-fpm",
"repositoryUri": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/php-fpm"
}
}
確認
$ aws ecr describe-repositories --region ap-northeast-1
{
"repositories": [
{
"registryId": "123456789012",
"repositoryName": "oreno/php-fpm",
"repositoryArn": "arn:aws:ecr:ap-northeast-1:123456789012:repository/oreno/php-fpm",
"repositoryUri": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/php-fpm"
},
{
"repositoryName": "oreno/nginx",
"repositoryArn": "arn:aws:ecr:ap-northeast-1:123456789012:repository/oreno/nginx",
"repositoryUri": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/nginx"
}
]
}
Dockerイメージの準備
nginxが入ったDockerイメージと、php-fpmのDockerイメージを作成していきます。
nginxが稼働するDockerイメージの作成
([EC2 Container Registryへ自作のDockerイメージをプッシュ](../../../../post/2016/11/docker-image-push-to-ecr/“EC2 Container Registryへ自作のDockerイメージをプッシュ”)で作成したものをベースにしています)
Dockerfileは以下です。
- Dockerfile
FROM amazonlinux
USER root
RUN set -x && \
yum -y install nginx
RUN set -x && \
echo "NETWORKING=yes" >/etc/sysconfig/network && \
mkdir -p /var/www/html && \
chown -R nginx.nginx /var/www/html
COPY templates/etc/nginx/nginx.conf /etc/nginx/nginx.conf
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 80
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
COPYを使っているので、以下のファイルも置いておきます。
- templates/etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name localhost;
root /var/www/html;
location / {
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
fastcgi_passとして、php-fpmというホスト名を指定していますが、これはphp-fpmが稼働するコンテナの名前を「php-fpm」としてlinkするためです。
buildします。
イメージ名はECRに作成したレポジトリのrepositoryUriと合わせます。
$ docker build -t 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/nginx:latest .
Sending build context to Docker daemon 6.144 kB
Step 1 : FROM amazonlinux
...
Successfully built 1234567890ab
buildが完了し、AmazonLinuxをベースとした、nginxが入ったコンテナイメージができました。
これをECRへpushします。
まず、aws cliを使用して、AmazonのDockerレジストリへアクセスできるパスワードを含んだdocker loginコマンド文字列を取得し、docker loginします。
$ aws ecr get-login --region ap-northeast-1
docker login -u AWS -p <passowrdpassword....> -e none https://123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
$ docker login -u AWS -p <passowrdpassword....> -e none https://123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
...
Login Succeeded
pushします。
$ docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/nginx:latest
The push refers to a repository [123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/nginx]
...
latest: digest: sha256:ee32d51b02cd4f325f768abb0d027d8cbdd4e6060f8ad64df12a23d5333ac18b size: 6317
pushされたことを確認します。
$ aws ecr list-images --repository-name oreno/nginx
{
"imageIds": [
{
"imageTag": "latest",
"imageDigest": "sha256:ee32d51b02cd4f325f768abb0d027d8cbdd4e6060f8ad64df12a23d5333ac18b"
}
]
}
php-fpmが稼働するDockerイメージの作成
Dockerfileは以下です。
- Dockerfile
FROM amazonlinux
USER root
RUN set -x && \
yum -y install php-fpm
RUN set -x && \
echo "NETWORKING=yes" >/etc/sysconfig/network && \
useradd php-fpm && \
mkdir -p /var/www/html && \
chown -R php-fpm.php-fpm /var/www/html && \
echo '<?php echo gethostname(); ?>' > /var/www/html/index.php
COPY templates/etc/php-fpm.conf /etc/php-fpm.conf
COPY templates/etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf
RUN ln -sf /dev/stdout /var/log/php-fpm/access.log \
&& ln -sf /dev/stderr /var/log/php-fpm/error.log
EXPOSE 9000
CMD ["/usr/sbin/php-fpm", "--nodaemonize"]
nginxではドキュメントルートは/var/www/html/としていますが、/var/www/html/index.phpに
<?php echo gethostname(); ?>
と書いて、http://【IPアドレス】/index.php へアクセスすると、ホスト名が表示されるようにしています。
ブラウザでアクセスしてリロードするたびに、ここが変わるかどうかをみたいと思います。
COPYを使っているので、以下のファイルも置いておきます。
- templates/etc/php-fpm.conf
include=/etc/php-fpm.d/*.conf
[global]
pid = /var/run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/error.log
- templates/etc/php-fpm.d/www.conf
[www]
listen = 0.0.0.0:9000
;listen.allowed_clients = any
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
catch_workers_output = yes
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
access.log = /var/log/php-fpm/access.log
buildします。
イメージ名はECRに作成したレポジトリのrepositoryUriと合わせます。
$ docker build -t 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/php-fpm:latest .
Sending build context to Docker daemon 6.144 kB
Step 1 : FROM amazonlinux
...
Successfully built 1234567890ab
buildが完了し、AmazonLinuxをベースとした、php-fpmが入ったコンテナイメージができました。 これをECRへpushします。
まず、aws cliを使用して、AmazonのDockerレジストリへアクセスできるパスワードを含んだdocker loginコマンド文字列を取得し、docker loginします。
$ aws ecr get-login --region ap-northeast-1
docker login -u AWS -p <passowrdpassword....> -e none https://123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
$ docker login -u AWS -p <passowrdpassword....> -e none https://123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
...
Login Succeeded
pushします。
$ docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/php-fpm:latest
The push refers to a repository [123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/php-fpm]
...
latest: digest: sha256:ee32d51b02cd4f325f768abb0d027d8cbdd4e6060f8ad64df12a23d5333ac18b size: 6317
pushされたことを確認します。
$ aws ecr list-images --repository-name oreno/php-fpm
{
"imageIds": [
{
"imageTag": "latest",
"imageDigest": "sha256:ee32d51b02cd4f325f768abb0d027d8cbdd4e6060f8ad64df12a23d5333ac18b"
}
]
}
クラスタの作成
マネジメントコンソールからECSを選択します。
クラスターを選択し、画面右から「クラスターの作成」をクリックします。
※次画面から急に英語になっちゃいます。。
作成するクラスタの設定を入力します。
ネットワーク周りの設定を入力します。
nginxを動かしますのでとりあえず80番を開けるのかなーと思って開けましたが、実際には80で着信するのはALBなので、ここでは特に指定はいらないはずです。
なのですが、このマネジメントコンソールのウィザードだとここを空欄にすることができないみたいなので、何かしら入れないと駄目です。でたらめで何か入れましょう。
IAMロールは、デフォルトでecsInstanceRoleというものが指定されていました。自動で適切なものを作ってくれるみたいです。
このまま「作成」をクリックします。
また日本語に。。
前画面で指定したリソースが作成されます。
裏でCloudFormationが動いているみたいです。
CloudFormationの画面を見ると、たしかにstackが追加されていました。
しばらくすると作成が完了し、クラスターが表示されます。
ターゲットグループ、Application Load Balancerの作成
ターゲットグループの作成
$ aws elbv2 create-target-group \
--name alb-target-group-ecs-sample \
--protocol HTTP \
--vpc-id vpc-1q2w3e4r \
--port 80 \
--health-check-protocol HTTP \
--health-check-port traffic-port \
--health-check-path '/' \
--health-check-interval-seconds 30 \
--health-check-timeout-seconds 5 \
--healthy-threshold-count 5 \
--unhealthy-threshold-count 2 \
--matcher HttpCode=200
{
"TargetGroups": [
{
"HealthCheckPath": "/",
"HealthCheckIntervalSeconds": 30,
"VpcId": "vpc-1q2w3e4r",
"Protocol": "HTTP",
"HealthCheckTimeoutSeconds": 5,
"HealthCheckProtocol": "HTTP",
"UnhealthyThresholdCount": 2,
"HealthyThresholdCount": 5,
"TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/alb-target-group-ecs-sample/9988uu99ii66yyff44",
"Matcher": {
"HttpCode": "200"
},
"HealthCheckPort": "traffic-port",
"Port": 80,
"TargetGroupName": "alb-target-group-ecs-sample"
}
]
}
「–heathcheck-port」では、通常はEC2がリッスンするポート(Webサーバなら80)を指定しますが、ECSの場合、Serviceがタスクに対し動的にポートを割り当てるため、指定ができません。
その場合、‘traffic-port’を指定します(ただ、ここは指定しなくてもデフォルトで’traffic-port’になります)。
続いて、ALB用のSecurity Groupを作成します。
$ aws ec2 create-security-group --group-name alb-ecs-sample-sg --description "Security group for alb" --vpc-id vpc-1q2w3e4r
{
"GroupId": "sg-5t6y7u8i"
}
作成したALB用のSecurity Groupのポート80を全開放します
$ aws ec2 authorize-security-group-ingress --group-id sg-5t6y7u8i --protocol tcp --port 80 --cidr 0.0.0.0/0
$ aws ec2 describe-security-groups --group-ids sg-5t6y7u8i | jq ".SecurityGroups[].IpPermissions"
[
{
"PrefixListIds": [],
"FromPort": 80,
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"ToPort": 80,
"IpProtocol": "tcp",
"UserIdGroupPairs": []
}
]
ECSクラスタ上のコンテナインスタンスは、タスクに動的にポートを割り当ててlistenします。
この範囲は、([Amazon EC2 Container Service TaskDefinition ContainerDefinitions PortMappings](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-containerdefinitions-portmappings.html"Amazon EC2 Container Service TaskDefinition ContainerDefinitions PortMappings")にあるように、49153〜65535です。
ということなので、ALBからコンテナインスタンスへの49153〜65535番ポートへの通信を許可すればいいのかな、と思いきや、それだとなぜかヘルスチェックが通りません!
一旦、ALBからコンテナインスタンスへの通信は全許可しました。本当はどうすれば。。
これはよくわからなかったので、今後の課題にします。
$ aws ec2 authorize-security-group-ingress --group-id sg-9o8i7u6y --protocol tcp --port 49153-65535 --source-group sg-5t6y7u8i
$ Administrator$ aws ec2 describe-security-groups --group-ids sg-9o8i7u6y | jq ".SecurityGroups[].IpPermissions"
[
{
"PrefixListIds": [],
"FromPort": 49153,
"IpRanges": [],
"ToPort": 65535,
"IpProtocol": "tcp",
"UserIdGroupPairs": [
{
"UserId": "123456789012",
"GroupId": "sg-5t6y7u8i"
}
]
}
]
ALBを作成します。
$ aws elbv2 create-load-balancer --name alb-ecs-sample --subnets subnet-z9a8q716 subnet-1m2j3u4y --security-groups sg-5t6y7u8i
{
"LoadBalancers": [
{
"VpcId": "vpc-1q2w3e4r",
"LoadBalancerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/alb-ecs-sample/1q2w3e4r5t6y7u8i",
"State": {
"Code": "provisioning"
},
"DNSName": "alb-ecs-sample-1470162055.ap-northeast-1.elb.amazonaws.com",
"SecurityGroups": [
"sg-5t6y7u8i"
],
"LoadBalancerName": "alb-ecs-sample",
"CreatedTime": "2016-12-04T15:47:13.510Z",
"Scheme": "internet-facing",
"Type": "application",
"CanonicalHostedZoneId": "Z14GRHDCWA56QT",
"AvailabilityZones": [
{
"SubnetId": "subnet-z9a8q716",
"ZoneName": "ap-northeast-1a"
},
{
"SubnetId": "subnet-1m2j3u4y",
"ZoneName": "ap-northeast-1c"
}
]
}
]
}
少し待つと
$ aws elbv2 describe-load-balancers --names alb-ecs-sample | jq ".LoadBalancers[].State"
{
"Code": "provisioning"
}
から、
$ aws elbv2 describe-load-balancers --names alb-ecs-sample | jq ".LoadBalancers[].State"
{
"Code": "active"
}
になり、ALBが作成完了します。
続いて、先ほど作成したターゲットグループをALBにリスナーとして紐付けます。
$ aws elbv2 create-listener \
--load-balancer-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/alb-ecs-sample/1q2w3e4r5t6y7u8i \
--protocol HTTP \
--port 80 \
--default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/alb-target-group-ecs-sample/9988uu99ii66yyff44
{
"Listeners": [
{
"Protocol": "HTTP",
"DefaultActions": [
{
"TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/alb-target-group-ecs-sample/9988uu99ii66yyff44",
"Type": "forward"
}
],
"LoadBalancerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/alb-ecs-sample/1q2w3e4r5t6y7u8i",
"Port": 80,
"ListenerArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:listener/app/alb-ecs-sample/1q2w3e4r5t6y7u8i/c95cc78cb047c6a0"
}
]
}
Task Definitionsの作成
Task Definitionsをaws cliで作成する場合は、項目が多いので、jsonを作成してそれを読み込ませています。
jsonの雛形を生成します。
aws ecs register-task-definition --generate-cli-skeleton > task-definitions.json
生成したtask-definitions.jsonを編集します。
{
"family": "task-definitions-nginx-php-fpm",
"containerDefinitions": [
{
"name": "nginx",
"image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/nginx",
"cpu": 1024,
"memory": 64,
"links": [
"php-fpm"
],
"portMappings": [
{
"containerPort": 80,
"hostPort": 0,
"protocol": "tcp"
}
]
},
{
"name": "php-fpm",
"image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/php-fpm",
"cpu": 1024,
"memory": 64
}
]
}
Task definitionを作成します。
{
"taskDefinition": {
"status": "ACTIVE",
"family": "task-definitions-nginx-php-fpm",
"requiresAttributes": [
{
"name": "com.amazonaws.ecs.capability.ecr-auth"
}
],
"volumes": [],
"taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:123456789012:task-definition/task-definitions-nginx-php-fpm:1",
"containerDefinitions": [
{
"environment": [],
"name": "nginx",
"links": [
"php-fpm"
],
"mountPoints": [],
"image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/nginx",
"essential": true,
"portMappings": [
{
"protocol": "tcp",
"containerPort": 80,
"hostPort": 0
}
],
"memory": 64,
"cpu": 1024,
"volumesFrom": []
},
{
"environment": [],
"name": "php-fpm",
"mountPoints": [],
"image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/oreno/php-fpm",
"cpu": 1024,
"portMappings": [],
"memory": 64,
"essential": true,
"volumesFrom": []
}
],
"revision": 1
}
}
Serviceの作成
Serviceを作成するにはクラスターのARNが必要ですのでaws cliで取得しておきます。
$ aws ecs describe-clusters --cluster ecs-cluster-sample | jq ".clusters[].clusterArn"
"arn:aws:ecs:ap-northeast-1:123456789012:cluster/ecs-cluster-sample"
Serviceを作成します。
$ aws ecs create-service \
--cluster arn:aws:ecs:ap-northeast-1:123456789012:cluster/ecs-cluster-sample \
--service-name ecs-service-sample \
--task-definition task-definitions-nginx-php-fpm:1 \
--load-balancers targetGroupArn=arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/alb-target-group-ecs-sample/9988uu99ii66yyff44,containerName=nginx,containerPort=80 \
--desired-count 10 \
--role ecsServiceRole
{
"service": {
"status": "ACTIVE",
"taskDefinition": "arn:aws:ecs:ap-northeast-1:123456789012:task-definition/task-definitions-nginx-php-fpm:3",
"pendingCount": 0,
"loadBalancers": [
{
"containerName": "nginx",
"targetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/alb-target-group-ecs-sample/9988uu99ii66yyff44",
"containerPort": 80
}
],
"roleArn": "arn:aws:iam::123456789012:role/ecsServiceRole",
"createdAt": 1480869441.932,
"desiredCount": 10,
"serviceName": "ecs-service-sample",
"clusterArn": "arn:aws:ecs:ap-northeast-1:123456789012:cluster/ecs-cluster-sample",
"serviceArn": "arn:aws:ecs:ap-northeast-1:123456789012:service/ecs-service-sample",
"deploymentConfiguration": {
"maximumPercent": 200,
"minimumHealthyPercent": 100
},
"deployments": [
{
"status": "PRIMARY",
"pendingCount": 0,
"createdAt": 1480869441.932,
"desiredCount": 10,
"taskDefinition": "arn:aws:ecs:ap-northeast-1:123456789012:task-definition/task-definitions-nginx-php-fpm:3",
"updatedAt": 1480869441.932,
"id": "ecs-svc/9223370555985333864",
"runningCount": 0
},
{
"status": "ACTIVE",
"pendingCount": 0,
"createdAt": 1480868913.607,
"desiredCount": 0,
"taskDefinition": "arn:aws:ecs:ap-northeast-1:123456789012:task-definition/task-definitions-nginx-php-fpm:2",
"updatedAt": 1480869340.633,
"id": "ecs-svc/9223370555985862188",
"runningCount": 0
}
],
"events": [],
"runningCount": 0
}
}
Application Load Balancerにアクセスして動作確認
ブラウザでALBのFQDNへアクセスしてみます。
リロードすると
という感じで、ホスト名が変わっていくのがわかります。
まとめ
ひととおりECSでWebをホストするところまでの動きが確認できました。
しかしまだサーバが障害などで停止した場合や、Task definitionsが更新された場合どのように新しいTaskが起動して新旧入れ替わりが起きるのか、AutoScalingはどういう動きになるのかなど、まだまだわからことがたくさんあるので、引き続き調べていきます。