Open bohebohe opened 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]$
ローカルの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
この前のAWS-CLIで使ったハンズオンを参考に実行する。 Amazon ECR + ECS CLI ハンズオン - Qiita http://qiita.com/zakky/items/be1e1a20cf7718ffae73
ECRのリポジトリを作成する。 ECR_REPOSITORY=bohe-node-server
コンソールで実行していると、上記の名前を入れるとリポジトリの名前が表示されてきます ただし、ここのリポジトリのアクセスは自分自身のみ。 他の人のアクセスを許可するためには、後で許可を付与する必要がある。
次の画面のステップでECRのログイン情報の取得が出ますが、本家のように簡単にid/pwでは接続出来ないため専用のコマンドが用意されています。
そのため、じぶんのターミナルでの情報を確認して、正しいaws configureがセットされているか確認しましょう。
さて、次の画面にいくと、このステップが表示されます。 1) Retrieve the docker login command that you can use to authenticate your Docker client to your registry:
この後ろにくっついているのが、ECRレポジトリです。
https://847086763546.dkr.ecr.us-east-1.amazonaws.com
手順通り実行してイメージを作成してリポジトリにpushします。
docker-compose.ymlを編集して、上記でpushしたイメージを使うようにします。
ECSクラスタを構築して、タスク定義の登録を行ってから 実行させたタスクをサービスとして登録する ECSへサービスを登録してから実際にタスクが実行状態となるまで30秒くらいかかる タスク定義の登録を行ってからサービス登録していると、コンテナが落ちても自動起動してくれている。
ECS CLIを使った場合は、タスクとサービスのみしか管理しません。 タスクやサービスを管理するためには、AWS CLIかマネージメントコンソールを利用するようにしてください。