概要
AWSコンテナ設計・構築[本格]入門をもとに自分でコンテナを動かそうとしてみた手順をまとめていこうかと思います。
動かす対象は以前こちらでcloud9上で動かしたコンテナをもとにしています。
タイトルの通りこれで完結ではないので続報ができたらこちらの概要も更新していきます。
ECRの作成
ロールの作成
- インスタンスに付与するロールをCloudShellで作成します。jsonファイルでポリシーを作成します内容は以下のものです。${AWS_ACCOUNT}の部分は各自のアカウントに変更してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ECRRepositoryList",
"Effect": "Allow",
"Action": [
"ecr:ListImages"
],
"Resource": [
"arn:aws:ecr:ap-northeast-1:${AWS_ACCOUNT}.dkr.ecr.ap-northeast-1.amazonaws.com/docker-advent"
]
},
{
"Sid": "GetAuthorizationToken",
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken"
],
"Resource": "*"
},
{
"Sid": "ECRRepositoryManage",
"Effect": "Allow",
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:DescribeRepositories",
"ecr:ListImages",
"ecr:DescribeImages",
"ecr:BatchGetImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload",
"ecr:PutImage"
],
"Resource": [
"arn:aws:ecr:ap-northeast-1:${AWS_ACCOUNT}.dkr.ecr.ap-northeast-1.amazonaws.com/docker-advent"
]
}
]
}
- 以下のコマンドでファイル名や後程使う変数を指定します。
FILE_IAM_POLICY_DOC='policy.json'
IAM_ROLE_NAME='dockerAdventRoll'
IAM_ROLE_PATH='/docker-advent/'
IAM_ROLE_ARN='arn:aws:iam::${AWS_ACCOUNT}:policy/dockerAdventPplicy'
IAM_INSTANCE_PROFILE_NAME='dockerAdventRoll'
IAM_INSTANCE_PROFILE_PATH='/docker-advent/'
- jsonファイルを作成します。
cat << EOF > ${FILE_IAM_POLICY_DOC}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ECRRepositoryList",
"Effect": "Allow",
"Action": [
"ecr:ListImages"
],
"Resource": [
"arn:aws:ecr:ap-northeast-1:${AWS_ACCOUNT}:repository/docker-advent"
]
},
{
"Sid": "GetAuthorizationToken",
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken"
],
"Resource": "*"
},
{
"Sid": "ECRRepositoryManage",
"Effect": "Allow",
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:DescribeRepositories",
"ecr:ListImages",
"ecr:DescribeImages",
"ecr:BatchGetImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload",
"ecr:PutImage"
],
"Resource": [
"arn:aws:ecr:ap-northeast-1:${AWS_ACCOUNT}:repository/docker-advent"
]
}
]
}
EOF
- ファイルの内容を確認します。
cat ${FILE_IAM_POLICY_DOC}
- jsonファイルとしての妥当性を確認
cat ${FILE_IAM_POLICY_DOC} \
| python3 -m json.tool \
> /dev/null
- ポリシーの作成
aws iam create-policy --policy-name dockerAdventPplicy --policy-document file://${FILE_IAM_POLICY_DOC}
- ロールを作成します。
aws iam create-role \
--role-name ${IAM_ROLE_NAME} \
--path "${IAM_ROLE_PATH}" \
--assume-role-policy-document \
'{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}'
- 作成したロールにポリシーをアタッチしインスタンスポロファイルも作成します。
aws iam attach-role-policy \
--role-name ${IAM_ROLE_NAME} \
--policy-arn ${IAM_ROLE_ARN}
aws iam create-instance-profile \
--instance-profile-name ${IAM_INSTANCE_PROFILE_NAME} \
--path "${IAM_INSTANCE_PROFILE_PATH}"
aws iam add-role-to-instance-profile --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME} --role-name ${IAM_ROLE_NAME}
ECRへのpush
-
こちらの手順でcloud9上で動かしているimageをpushします。(このままではECSでうまく動かなかったので、コンテナ自体ビルドしなおすかもしれません。)
-
以下のコマンドでタグをつけます。${imageID}の部分は
docker images
で確認したimageのIDを指定してください。
docker tag ${imageID} mongamaenioh/radvent:v1
- ECRにpushするためにtagを修正します。
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
docker image tag mongamaenioh/radvent:v1 ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/docker-advent:v1
- ECRへログインをします。
aws ecr --region ap-northeast-1 get-login-password | docker login --username AWS --password-stdin https://${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/docker-advent
- imageをpushします。
docker image push ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/docker-advent:v1
- 最後にimageをpullして確認を行います。
docker image pull ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/docker-advent:v1
最後に
とりあえずはECRへのpushまでの手順となります。
ECSに登録したところすぐにコンテナが終了してしまうためコンテナのbuildをやり直す必要があるかもしれません・・・