🚀

【インフラ_15日目】CI/CD_1冊目

2024/08/17に公開

こんにちは投資ロウトです。

背景

・CI/ CDをシステムに導入していかなければならない背景があります。

サービス

実行環境の用意に関しての種類
・本番環境・・・ユーザーがアクセス
・テスト環境・・・内部のものだけがアクセス
・ステージング環境・・・本番リリース前の検証の環境
・QA環境・・・テストチーム等がテストを実施する環境
・評価環境・・・アプリケーションのパフォーマンステスト等を実行する環境

デプロイ

【必要なこと】
・ビルド・・・実行環境で起動するソフトウェアの作成
・デプロイ・・・作成したソフトウェアを実行環境へ配置
※ただし手動のデプロイはヒューマンエラーが起こしやすく、自動化が必要不可欠とのこと(コンテナオーケストレーションが活躍)。

コンテナ

・コンテナイメージ・・・アプリケーションと依存関係をまとめる
→これをすることで、ローカル環境では動くけれど、本番環境では動かないという事態は避けられるとのこと。

・Amazon ECS, Kubernetes・・・これらを使うと、複数マシンでコンテナを効率よく実行できるとのこと。

【AWS】
・ECS・・・コンテナオーケストレーションシステムを簡単に構築できるマネージドサービス
・ECR・・・コンテナレジストリのマネージドサービスで、ECSと簡単に連携できる
※ECRリポジトリへのプッシュやプルはDockerから実行可能とのこと。

AWS Copilot・・・ECSやECRを簡単に実行できるコマンドラインツール
※AWS CloudShellにインストールされているとのこと。

copilot --version

# 変数を設定
export APP_NAME=アプリ名
export SVC_NAME=サービス名
export ENV_NAME=環境変数名

追加で実施

copilot app init $APP_NAME

権限エラー発生

✘ get application demo: get application demo: AccessDeniedException: User: arn:aws:iam::AWS_ID:user/UserName is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:AWS_Region:AWS_ID:parameter/copilot/applications/app_Name because no identity-based policy allows the ssm:GetParameter action
        status code: 400, request id: AAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEE

権限の追加

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
			    "ssm:GetParameter",
			    "ssm:PutParameter",
                "ssm:AddTagsToResource",
                "ssm:GetParametersByPath"
			],
			"Resource": "arn:aws:ssm:AWS_REGION:AWS_ID:parameter/copilot/applications/demo*"
		}
	]
}

続いて権限エラー

✘ Proposing infrastructure changes for stack app
✘ describe stack app: AccessDenied: User: arn:aws:iam::AWS_ID:user/User_Name is not authorized to perform: cloudformation:DescribeStacks on resource: arn:aws:cloudformation:Aws_Region:Aws_Id:stack/app/* because no identity-based policy allows the cloudformation:DescribeStacks action
        status code: 403, request id: AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEE: describe stack: describe stack events for stack app: AccessDenied: User: arn:aws:iam::Aws_Id:user/User_Name is not authorized to perform: cloudformation:DescribeStackEvents on resource: arn:aws:cloudformation:Aws_Region:Aws_Id:stack/app/* because no identity-based policy allows the cloudformation:DescribeStackEvents action
        status code: 403, request id: AAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEE

以下をつける

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"cloudformation:DescribeStacks",
				"cloudformation:CreateChangeSet",
				"cloudformation:DescribeChangeSet",
				"cloudformation:ExecuteChangeSet",
				"cloudformation:GetTemplate",
				"cloudformation:DescribeStackEvents",
				"cloudformation:TagResource",
                "cloudformation:CreateStackSet",
                "cloudformation:GetTemplateSummary",
                "cloudformation:DescribeStackSet",
                "cloudformation:UpdateStackSet",
                "cloudformation:ListStackInstances",
                "cloudformation:DescribeStackSetOperation",
                "cloudformation:CreateStackInstances"
			],
			"Resource": [
				"arn:aws:cloudformation:AWS_RESION:AWS_ID:stack/app/*",
				"arn:aws:cloudformation:AWS_RESION:AWS_ID:stackset/demo-infrastructure:*",
               "arn:aws:cloudformation:AWS_REGION:AWS_ID:stack/App*",
               "arn:aws:cloudformation:AWS_REGION:AWS_ID:stack/app/*"
			]
		}
	]
}

再度実行。

Your workspace is registered to application demo.
✘ Proposing infrastructure changes for stack app
✘ stack app is currently being updated and cannot be deployed to

スタックが作成されて実行中だったため、cloudformationに入り、スタックを削除する。また以下の権限も必要だったため追加

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:GetRole",
                "iam:DeleteRolePolicy",
                "iam:CreateRole",
                "iam:TagRole",
                "iam:PutRolePolicy",
                "iam:DeleteRole",
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:iam::AWS_ID:role/app",
                "arn:aws:iam::AWS_ID:role/app2"
            ]
        }
    ]
}

権限をつけていったのですが、量が多すぎて地獄でした。。。

以下を実施

copilot svc init --name $SVC_NAME --app $APP_NAME --image nginx --port 80 --svc-type "Load Balanced Web Service"

権限問題はまだ続く、、、

Note: It's best to run this command in the root of your workspace.
✘ validate if service exists: AccessDeniedException: User: arn:aws:iam::AWS_ID:user/USER_NAME is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:AWS_REGION:AWS_ID:parameter/copilot/applications/demo/components/example because no identity-based policy allows the ssm:GetParameter action
        status code: 400, request id: AAAAAA-GBBBB-CCCC-DDDD-EEEEEEEEE

他にも大量の権限が必要でしたが、上記の方にマージしています。

テスト環境を構築

copilot env init --name $ENV_NAME --app $APP_NAME \
--profile default --default-config

権限エラーが発生

✔ Wrote the manifest for environment test at copilot/environments/test/manifest.yml
✘ add env test to application demo: adding test environment resources to application: retrieve stack instance streamers: describe operation "2" for stack set "demo-infrastructure": describe operation 2 for stack set demo-infrastructure: AccessDenied: User: arn:aws:iam::AWS_ID:user/USER_NAME is not authorized to perform: cloudformation:DescribeStackSetOperation on resource: arn:aws:cloudformation:AWS_REGION:AWS_ID:stackset/demo-infrastructure:AAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEE because no identity-based policy allows the cloudformation:DescribeStackSetOperation action

再度権限をつける
※他の権限は上記に追記

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"kms:GenerateDataKey"
			],
			"Resource": "arn:aws:kms:AWS_REGION:AWS_ID:key/AAAAAA-BBBBB-CCCCC-DDDDDD"
		}
	]
}

s3関連の権限もつける

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::stackset-.....-*",
                "arn:aws:s3:::stackset-.....-*/*"
            ]
        }
    ]
}

一から権限をつけるのが、エグすぎて一旦色々上手くやるように軌道修正。テスト環境構築

copilot env init --name $ENV_NAME --app $APP_NAME \
--profile default --default-config

copilot env deploy --name $ENV_NAME

さらに権限エラー

✘ get template version of environment test: get metadata for stack app: get template summary: AccessDenied: User: arn:aws:iam::AWS_ID:user/USER_NAME is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::AWS_ID:role/app-EnvManagerRole
        status code: 403, request id: AAAAA-BBBB-CCCC-DDDD-EEEEEEEE

copilot svc deploy --name $SVC_NAME --env $ENV_NAME

ECSでリリースするには

ECSのサービスにデプロイするには、以下をすればいいとのこと。
・ECRリポジトリへコンテナイメージをプッシュする
・ECSサービスやタスク定義を更新する
・ECSサービスへIAMロールを渡す

また以下のVariablesの管理も必要とのこと。
・ECSクラスター名
・ECSサービス名
・タスク定義名
・ECRリポジトリURI
・コンテナ名

デプロイを自動化するには

2つのローカルアクションが必要とのこと。
・コンテナビルドアクション
・コンテナデプロイアクション

# ECRへログイン
- uses:aws-actions/amazon-ecr-login@v2

・ロールバック・・・デプロイで問題があった際に、以前のバージョンへ切り戻しを行うこと

と短いですが、以上で学習を区切りたいと思います。ご精読ありがとうございました。焦らずコツコツ頑張っていきたいと思います。

Discussion