🍣

cloudformationでECRとかデプロイする

4 min read

デプロイ作業の自分用一旦メモです
後ほど書き直します

ECSにdockerリポジトリ作成

https://ap-northeast-1.console.aws.amazon.com/ecr/repositories?region=ap-northeast-1

ローカル環境にdockerイメージビルド

docker-compose build

ローカルでテストしたい場合は「 docker-compose up 」でコンテナを起動

dockerのタグをECR用に変更

docker tag insta-api_lambda:latest <aws_client_id>.dkr.ecr.ap-northeast-1.amazonaws.com/<lambda_repository>:dev

aws_client_idにはawsクライアントID(12桁の数字)

ECRのレポジトリにイメージをpush

# ECRレポジトリにdocker login
aws ecr get-login-password --profile <credentialsの[]> --region ap-northeast-1 | docker login --username AWS --password-stdin <aws_client_id>.dkr.ecr.ap-northeast-1.amazonaws.com

#イメージをpush
docker push <aws_client_id>.dkr.ecr.ap-northeast-1.amazonaws.com/<lambda_repository>:dev

複数のawsアカウントを使い分けている場合、profileを指定しないとdefaultのアカウントに繋がってしまう

--profile <credentialsの[]>

https://qiita.com/sakai00kou/items/b3284b93145967d25c86

S3にバケット作成

aws s3 mb s3://<bucket-name>

デプロイ!

aws cloudformation deploy --profile <credentialsの[]> --template-file ./template.yml --stack-name <stack-name> --capabilities CAPABILITY_IAM

下記ポリシー追加必要だった

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ecr:SetRepositoryPolicy",
                "ecr:CompleteLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:InitiateLayerUpload",
                "ecr:GetRepositoryPolicy"
            ],
            "Resource": "arn:aws:ecr:ap-northeast-1:xxxxxx:repository/*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "ecr:GetAuthorizationToken",
            "Resource": "*"
        }
    ]
}

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ecs:DescribeClusters",
            "Resource": "arn:aws:ecs:ap-northeast-1:xxxxxxx:cluster/*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "ecs:DeregisterTaskDefinition",
                "ecs:CreateCluster",
                "ecs:RegisterTaskDefinition"
            ],
            "Resource": "*"
        }
    ]
}

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "iam:PassRole",
                "iam:DetachRolePolicy",
                "iam:CreateServiceLinkedRole",
                "iam:CreateRole",
                "iam:DeleteRole",
                "iam:AttachRolePolicy"
            ],
            "Resource": "arn:aws:iam::xxxxxxxx:role/*"
        }
    ]
}

こんなエラーが出た
エラー①

論理 ID:ECSCluster
ステータス:CREATE_FAILED
状況の理由:Resource handler returned message: "Invalid request provided: CreateCluster Invalid Request: Unable to assume the service linked role. Please verify that the ECS service linked role exists. (Service: AmazonECS; Status Code: 400; Error Code: InvalidParameterException; Request ID: 5cda9e68-7871-491a-8a1a-c9174f2d2332; Proxy: null)" (RequestToken: 3ed6460d-df06-8a3b-468e-1541ef22ca2a, HandlerErrorCode: InvalidRequest)

事前にECSのクラスターを作成して、template.ymlからクラスターの記載をコメントアウトするとできた。
手動でクラスターを作成するときも同様のエラーが一回でて、この記事にあるようにもう一回実行すると作成でた。

https://nekopunch.hatenablog.com/entry/2018/09/01/122525

どういうことか整理すると、
①クラスターを作成すると、「AWSServiceRoleForECS」ってやつが自動で生成される。
②生成されるのに若干時間がかかる。
③生成を待たずに次に進んでしまう。AWSServiceRoleForECSがないと怒られる。

なのでcloudformationにて、クラスターを自動生成するのは難しそう
今回は手動で事前に作成することで回避!

ちなみに、cloudformationのエラーは各スタックの「イベント」から確認する
cloudformationの処理の塊をスタックというらしい
デプロイ時に--stack-nameで名前をつける
失敗したら、スタックを削除して、再度実行!

エラー②
デプロイ後、APIGatewayにcurlでリクエスト投げて発生

{"message":"Missing Authentication Token"}

URLのタイポ!

Discussion

ログインするとコメントできます