【インフラ_15日目】CI/CD_1冊目
こんにちは投資ロウトです。
背景
・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