bohebohe / toolbox

bohelabo's app and infra toolbox
0 stars 0 forks source link

[AWS]ECSインスタンスにnginx,node.js,fluentdのdockerを実行する #2

Open bohebohe opened 8 years ago

bohebohe commented 8 years ago

この前のAWS-CLIで使ったハンズオンを参考に実行する。 Amazon ECR + ECS CLI ハンズオン - Qiita http://qiita.com/zakky/items/be1e1a20cf7718ffae73

ECRのリポジトリを作成する。 ECR_REPOSITORY=bohe-node-server

コンソールで実行していると、上記の名前を入れるとリポジトリの名前が表示されてきます ただし、ここのリポジトリのアクセスは自分自身のみ。 他の人のアクセスを許可するためには、後で許可を付与する必要がある。

次の画面のステップでECRのログイン情報の取得が出ますが、本家のように簡単にid/pwでは接続出来ないため専用のコマンドが用意されています。

そのため、じぶんのターミナルでの情報を確認して、正しいaws configureがセットされているか確認しましょう。

ボヘラボのを使います。

[~/bohelabo 14:07:24]$ export AWS_DEFAULT_PROFILE=bohelabo
[~/bohelabo 14:07:29]$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                 bohelabo           manual    --profile
access_key     ****************FBIA shared-credentials-file
secret_key     ****************+ifB shared-credentials-file
    region                us-east-1      config-file    ~/.aws/config
[~/bohelabo 14:07:36]$

さて、次の画面にいくと、このステップが表示されます。 1) Retrieve the docker login command that you can use to authenticate your Docker client to your registry:

aws ecr get-login --region us-east-1

docker login -u AWS -p CiBwm0YaISJeRtJm5n1G6uqeekXuoXXP(略)QlYrVYfh9c240y2sJ -e none https://847086763546.dkr.ecr.us-east-1.amazonaws.com

この後ろにくっついているのが、ECRレポジトリです。

https://847086763546.dkr.ecr.us-east-1.amazonaws.com

手順通り実行してイメージを作成してリポジトリにpushします。

1) Retrieve the docker login command that you can use to authenticate your Docker client to your registry:

2) Run the docker login command that was returned in the previous step.

3) Build your Docker image using the following command. For information on building a Docker file from scratch see the instructions here. You can skip this step if your image is already built:
docker build -t bohe-node-server .

4) After the build completes, tag your image so you can push the image to this repository:
docker tag bohe-node-server:latest 847086763546.dkr.ecr.us-east-1.amazonaws.com/bohe-node-server:latest

5) Run the following command to push this image to your newly created AWS repository:
docker push 847086763546.dkr.ecr.us-east-1.amazonaws.com/bohe-node-server:latest

docker-compose.ymlを編集して、上記でpushしたイメージを使うようにします。

nginx:
    image: 847086763546.dkr.ecr.us-east-1.amazonaws.com/bohe-nginx
    links:
        - node:node
    ports:
        - "80:80"
node:
    image: 847086763546.dkr.ecr.us-east-1.amazonaws.com/bohe-node
    ports:
        - "3000"
    build: ./node/ciapp

ECSクラスタを構築して、タスク定義の登録を行ってから 実行させたタスクをサービスとして登録する ECSへサービスを登録してから実際にタスクが実行状態となるまで30秒くらいかかる タスク定義の登録を行ってからサービス登録していると、コンテナが落ちても自動起動してくれている。

ECS CLIを使った場合は、タスクとサービスのみしか管理しません。 タスクやサービスを管理するためには、AWS CLIかマネージメントコンソールを利用するようにしてください。

[ci_sample/bohelabo 20:32:43]$ ecs-cli compose --project-name bohe --file docker-compose.yml up
WARN[0000] Skipping unsupported YAML option...           option name=build
INFO[0001] Using ECS task definition                     TaskDefinition=ecscompose-bohe:1
ERRO[0001] Error running tasks                           error=InvalidParameterException: No Container Instances were found in your cluster.
    status code: 400, request id: cad97419-f4d8-11e5-9419-73c678fbd7c5 task definition=arn:aws:ecs:us-east-1:847086763546:task-definition/ecscompose-bohe:1
FATA[0001] InvalidParameterException: No Container Instances were found in your cluster.
    status code: 400, request id: cad97419-f4d8-11e5-9419-73c678fbd7c5
bohebohe commented 8 years ago

▼手元に環境がない場合はEC2のインスタンスを立ち上げて、そこで実行するようにしましょう ECSに必要なポリシーである AmazonEC2ContainerServiceforEC2Role を付与したIAMロールを作成してコンテナインスタンスを起動してみることにする。 ・IAMロールを作成して、その作成したロールにポリシーを追加 ・インスタンスプロファイルの作成 ・インスタンスプロファイルへIAMロールを追加 ・EC2インスタンスへログインするための鍵ペアの作成、セキュリティグループの作成、コンテナインスタンスの起動までを行う。

以下が実行時のログ


[~/bohelabo 14:30:26]$ ROLE_NAME="ecr-role"
[~/bohelabo 14:47:11]$ aws iam create-role --role-name ${ROLE_NAME} --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }'
{
    "Role": {
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "sts:AssumeRole",
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "ec2.amazonaws.com"
                    }
                }
            ]
        },
        "RoleId": "AROAINJEW6XAZD22QAH2O",
        "CreateDate": "2016-03-28T05:47:21.497Z",
        "RoleName": "ecr-role",
        "Path": "/",
        "Arn": "arn:aws:iam::847086763546:role/ecr-role"
    }
}
[~/bohelabo 14:47:21]$ POLICY_ARN="arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role"
[~/bohelabo 14:47:32]$ aws iam attach-role-policy --role-name ${ROLE_NAME} --policy-arn ${POLICY_ARN}
[~/bohelabo 14:47:38]$ INSTANCE_PROFILE_NAME="ecr-profile"
[~/bohelabo 14:47:48]$ aws iam create-instance-profile --instance-profile-name ${INSTANCE_PROFILE_NAME}
{
    "InstanceProfile": {
        "InstanceProfileId": "AIPAJ7AODZY7XMATZGHNG",
        "Roles": [],
        "CreateDate": "2016-03-28T05:47:55.443Z",
        "InstanceProfileName": "ecr-profile",
        "Path": "/",
        "Arn": "arn:aws:iam::847086763546:instance-profile/ecr-profile"
    }
}
[~/bohelabo 14:47:55]$ aws iam add-role-to-instance-profile --instance-profile-name ${INSTANCE_PROFILE_NAME} --role-name ${ROLE_NAME}

[~/bohelabo 14:48:03]$ EC2_KEY_NAME="ecr-ec2-bohelabo"
[~/bohelabo 14:49:03]$ FILE_SSH_KEY="${HOME}/.ssh/${EC2_KEY_NAME}.pem"
[~/bohelabo 14:49:08]$ aws ec2 create-key-pair --key-name ${EC2_KEY_NAME} --query 'KeyMaterial' --output text > ${FILE_SSH_KEY} && cat ${FILE_SSH_KEY} && chmod 600 ${FILE_SSH_KEY}

[~/bohelabo 14:49:17]$ SG_NAME="ecr-sg"
[~/bohelabo 14:49:31]$ aws ec2 create-security-group --group-name ${SG_NAME} --description ${SG_NAME}
SG_ID=`aws ec2 describe-security-groups --filter Name=group-name,Values=${SG_NAME} --query 'SecurityGroups[].GroupId' --output text` && echo ${SG_ID}
{
    "GroupId": "sg-5ee69a26"
}
[~/bohelabo 14:49:40]$ SG_ID=`aws ec2 describe-security-groups --filter Name=group-name,Values=${SG_NAME} --query 'SecurityGroups[].GroupId' --output text` && echo ${SG_ID}
sg-5ee69a26
[~/bohelabo 14:49:42]$ aws ec2 authorize-security-group-ingress --group-id ${SG_ID} --protocol 'tcp' --port 80 --cidr 0.0.0.0/0
[~/bohelabo 14:49:53]$ TERM_IP=`curl -s http://ip-api.com/json | jq -r '.query'` && echo ${TERM_IP}
aws ec2 authorize-security-group-ingress --group-id ${SG_ID} --protocol 'tcp' --port 22 --cidr ${TERM_IP}/32
110.233.253.68
[~/bohelabo 14:50:19]$ aws ec2 authorize-security-group-ingress --group-id ${SG_ID} --protocol 'tcp' --port 22 --cidr ${TERM_IP}/32
[~/bohelabo 14:50:21]$ AMZLINUX_VERSION='2015.09.g'
[~/bohelabo 14:50:30]$ EC2_IMAGE_NAME="amzn-ami-${AMZLINUX_VERSION}-amazon-ecs-optimized"
[~/bohelabo 14:50:34]$ EC2_IMAGE_ID=`aws ec2 describe-images --filters Name=name,Values="${EC2_IMAGE_NAME}" --query 'Images[].ImageId' --output text` && echo ${EC2_IMAGE_ID}
ami-33b48a59
[~/bohelabo 14:50:44]$ EC2_INSTANCE_TYPE='t2.micro'
[~/bohelabo 14:50:49]$ aws ec2 run-instances --image-id ${EC2_IMAGE_ID} --instance-type ${EC2_INSTANCE_TYPE} --security-group-ids ${SG_ID} --key-name ${EC2_KEY_NAME} --associate-public-ip-address --iam-instance-profile Name=${INSTANCE_PROFILE_NAME}
{
    "OwnerId": "847086763546",
    "ReservationId": "r-c16f336a",
    "Groups": [],
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            },
            "PublicDnsName": "",
            "RootDeviceType": "ebs",
            "State": {
                "Code": 0,
                "Name": "pending"
            },
            "EbsOptimized": false,
            "LaunchTime": "2016-03-28T05:50:58.000Z",
            "PrivateIpAddress": "172.31.52.199",
            "ProductCodes": [],
            "VpcId": "vpc-c5d5d2a1",
            "StateTransitionReason": "",
            "InstanceId": "i-945d6c17",
            "ImageId": "ami-33b48a59",
            "PrivateDnsName": "ip-172-31-52-199.ec2.internal",
            "KeyName": "ecr-ec2-bohelabo",
            "SecurityGroups": [
                {
                    "GroupName": "ecr-sg",
                    "GroupId": "sg-5ee69a26"
                }
            ],
            "ClientToken": "",
            "SubnetId": "subnet-36c1731c",
            "InstanceType": "t2.micro",
            "NetworkInterfaces": [
                {
                    "Status": "in-use",
                    "MacAddress": "12:f0:f0:ea:e7:3d",
                    "SourceDestCheck": true,
                    "VpcId": "vpc-c5d5d2a1",
                    "Description": "",
                    "NetworkInterfaceId": "eni-bc989699",
                    "PrivateIpAddresses": [
                        {
                            "PrivateDnsName": "ip-172-31-52-199.ec2.internal",
                            "Primary": true,
                            "PrivateIpAddress": "172.31.52.199"
                        }
                    ],
                    "PrivateDnsName": "ip-172-31-52-199.ec2.internal",
                    "Attachment": {
                        "Status": "attaching",
                        "DeviceIndex": 0,
                        "DeleteOnTermination": true,
                        "AttachmentId": "eni-attach-48b210b9",
                        "AttachTime": "2016-03-28T05:50:58.000Z"
                    },
                    "Groups": [
                        {
                            "GroupName": "ecr-sg",
                            "GroupId": "sg-5ee69a26"
                        }
                    ],
                    "SubnetId": "subnet-36c1731c",
                    "OwnerId": "847086763546",
                    "PrivateIpAddress": "172.31.52.199"
                }
            ],
            "SourceDestCheck": true,
            "Placement": {
                "Tenancy": "default",
                "GroupName": "",
                "AvailabilityZone": "us-east-1b"
            },
            "Hypervisor": "xen",
            "BlockDeviceMappings": [],
            "Architecture": "x86_64",
            "StateReason": {
                "Message": "pending",
                "Code": "pending"
            },
            "IamInstanceProfile": {
                "Id": "AIPAJ7AODZY7XMATZGHNG",
                "Arn": "arn:aws:iam::847086763546:instance-profile/ecr-profile"
            },
            "RootDeviceName": "/dev/xvda",
            "VirtualizationType": "hvm",
            "AmiLaunchIndex": 0
        }
    ]
}
[~/bohelabo 14:50:58]$ EC2_INSTANCE_ID=`aws ec2 describe-instances --filters Name=instance-state-name,Values=pending --query 'Reservations[].Instances[].InstanceId' --output text` && echo ${EC2_INSTANCE_ID}
i-945d6c17
[~/bohelabo 14:51:08]$ EC2_PUBLIC_IP=`aws ec2 describe-instances --instance-id ${EC2_INSTANCE_ID} --query "Reservations[].Instances[].PublicIpAddress" --output text` && echo ${EC2_PUBLIC_IP}
52.91.167.80
[~/bohelabo 14:51:34]$
bohebohe commented 8 years ago

ローカルのMacBookでの実践方法

ログイン取得

[ci_sample/bohelabo 16:17:27]$  aws --region us-east-1 ecr get-login
docker login -u AWS -p CiBwm0YaIS(略)hG9/fa4mI34FaM7 -e none https://847086763546.dkr.ecr.us-east-1.amazonaws.com
[ci_sample/bohelabo 17:49:05]$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                 bohelabo           manual    --profile
access_key     ****************FJIA shared-credentials-file
secret_key     ****************+ifS shared-credentials-file
    region                us-east-1      config-file    ~/.aws/config

ログインする

[ci_sample/bohelabo 17:49:15]$ docker login -u AWS -p CiBwm0YaI(略)aM7 -e none https://847086763546.dkr.ecr.us-east-1.amazonaws.com
WARNING: login credentials saved in /Users/bohebohechan/.docker/config.json
Login Succeeded

リポジトリを作成する

ci_sample/bohelabo 19:12:56]$ aws --region us-east-1 ecr create-repository --repository-name ecr-ci-sample
{
    "repository": {
        "registryId": "847086763546",
        "repositoryName": "ecr-ci-sample",
        "repositoryArn": "arn:aws:ecr:us-east-1:847086763546:repository/ecr-ci-sample"
    }
}

ECRレジストリ

847086763546.dkr.ecr.us-east-1.amazonaws.com

ECRレポジトリ

ecr-ci-sample

docker環境を構築する。

docker-compose.yml

docker環境をビルドする

docker-machine create --driver virtualbox ci-sample
eval $(docker-machine env ci-sample)
docker-compose build

eval $(docker-machine env ci-sample)

pushする

docker push 847086763546.dkr.ecr.us-east-1.amazonaws.com/ecr-ci-sample:latest