0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

初心者がローカルのdockerをAWSにアップして動かすまで(その2)

Last updated at Posted at 2024-11-21

1.目標

ローカルPC(Windows 11 Home)のDocker Desktopで、WordPressを動かしています。
これをGitHubに登録し、AWSのCodePipelineでデプロイして、ECS Fagateで実行します。
※1. コンテンツは外部公開せず、あくまでも個人的な実験のために作成する(基本的にドメインを買ったりDNS登録したりしない)
※2. DBはRDS、ファイルはS3に保存する

これは四苦八苦しながら、目標達成まで頑張る初心者の作業記録です。
なお、ChatGPTをフル活用して、作業をガイドしてもらいます。
さあどうなるか……?!

★前回までの記事は以下
https://qiita.com/twilightdragonfly/items/9d2895cf8ee590198bc3

2.コンテナをイメージとして保存

前回の記事でWordPressのセッティングを行いました。
これをカスタムイメージとして保存し、AWS ECRにアップしたいと思います。
まずは、ローカルPCで作業中のdockerの状態を確認します。

PowerShell
PS C:\Users\testuser> docker ps

コンテナが起動していなかったので、以下コマンドで起動します。
注意事項として、このコマンドはdocker-compose.ymlのあるフォルダで実行します。

PowerShell
PS C:\Users\testuser\test_wordpress> docker-compose start

再度、コマンドを打って、現在の状態を確認します。

PowerShell
PS C:\Users\testuser\test_wordpress> docker ps
CONTAINER ID   IMAGE                  COMMAND                   CREATED      STATUS                    PORTS                  NAMES
c2f3b347148d   wordpress:6.6-php8.1   "docker-entrypoint.s…"   6 days ago   Up 4 seconds              0.0.0.0:8082->80/tcp   wordpress-wp
919d27004852   mysql:8.0              "docker-entrypoint.s…"   6 days ago   Up 5 seconds              3306/tcp, 33060/tcp    wordpress-db

それでは、wordpress-wpコンテナのイメージを保存したいと思います。

PowerShell
PS C:\Users\testuser\test_wordpress> docker commit wordpress-wp my-custom-wordpress:latest

ちなみに、DBはRDSに移行するつもりなので、必要なのはwordpress-wpコンテナだけです。
イメージを保存できたか、以下コマンドで確認します。

PowerShell
PS C:\Users\testuser\test_wordpress> docker images
REPOSITORY            TAG          IMAGE ID       CREATED          SIZE
my-custom-wordpress   latest       7e7c8e0091dc   16 seconds ago   987MB

次は、このイメージをAWS ECRにアップしたいと思います。

3.Terraformインストール

すっかり申し遅れておりましたが、Terraformも使ってやろうと欲張りなことを考えていました。
以下URLからTerraformをダウンロードしてきました。
https://developer.hashicorp.com/terraform/install

①C:\Program Files\terraformに解凍して設置
②環境変数を編集する。「Path」に「C:\Program Files\terraform」を追加
③Powershellまたはコマンドプロンプトで以下コマンドを実行し、インストールされたことを確認する

PowerShell
PS C:\Users\testuser> terraform -version
Terraform v1.9.8
on windows_amd64

4.ECRリポジトリ作成

TerraformでECRのリポジトリを作成します。
作業フォルダに、以下内容のmain.tfを保存しました。

provider "aws" {
  region = "ap-northeast-1" # 自分のリージョンを指定
}

# ECRリポジトリの作成
resource "aws_ecr_repository" "my_custom_wordpress" {
  name = "my-custom-wordpress"
  image_scanning_configuration {
    scan_on_push = true
  }
  tags = {
    Environment = "Practice"
  }
}

# ECRへのアクセス用IAMポリシー
resource "aws_iam_policy" "ecr_push_policy" {
  name        = "ECRPushPolicy"
  description = "Policy to allow pushing images to ECR"
  policy      = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Effect   = "Allow",
        Action   = [
          "ecr:GetAuthorizationToken",
          "ecr:BatchCheckLayerAvailability",
          "ecr:CompleteLayerUpload",
          "ecr:UploadLayerPart",
          "ecr:InitiateLayerUpload",
          "ecr:PutImage"
        ],
        Resource = "*"
      }
    ]
  })
}

次に以下コマンドを実行します。

PowerShell
PS C:\Users\testuser> terraform init

すると「.terraform: The system cannot find the file specified.」エラー発生。
Windowsセキュリティによってブロックされたため、「ウイルスと脅威の防止」の履歴からterraform.exeを許可しました。
気を取り直して先に進みます。

PowerShell
PS C:\Users\testuser> terraform plan

エラーが発生したのですが、要はAWSの権限足りないよというものだったので略させていただきます。
この後もたびたびAWSの権限が足りないと怒られました。最終的に追加したポリシーは以下になります。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"ecr:CreateRepository",
				"ecr:DeleteRepository",
				"ecr:DescribeRepositories",
				"ecr:GetAuthorizationToken",
				"ecr:BatchCheckLayerAvailability",
				"ecr:BatchGetImage",
				"ecr:InitiateLayerUpload",
				"ecr:UploadLayerPart",
				"ecr:CompleteLayerUpload",
				"ecr:TagResource",
				"ecr:ListTagsForResource",
				"ecr:PutImage"
			],
			"Resource": "arn:aws:ecr:ap-northeast-1:xxxx:repository/*"
		},
		{
			"Effect": "Allow",
			"Action": [
				"iam:CreatePolicy",
				"iam:AttachRolePolicy",
				"iam:GetPolicy",
				"iam:GetPolicyVersion",
				"iam:ListPolicyVersions",
				"iam:DeletePolicy",
				"iam:PassRole",
				"ecr:GetAuthorizationToken"
			],
			"Resource": "*"
		}
	]
}

iam:PassRoleアクションを許可するリソースをワイルドカード(*)で指定しているため、セキュリティがばがばです。
本番運用では怒られるため、作業の時だけ権限付与するようにします。
一案として、リソース変更権限を持つロールを用意して、本番作業時のみスイッチすることが考えられます。
なお、スイッチした瞬間にEventBridgeでCloudTrailのイベントを取得し、SNSで通知するようにすれば、企業が求めるセキュアな運用に沿うでしょう。

さて、以下コマンドでplanで確認したECRリポジトリを作成します。
※詰まったら「terraform plan」からやり直しになります。

PowerShell
PS C:\Users\testuser> terraform apply

TerraformでAWSのリソースを作成することができました。

5.ECRにイメージをPUSH

Terraformで作成したECRリポジトリ名を利用し、AWS CLIを使ってログインします

PowerShell
PS C:\Users\testuser> aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin AWSID.dkr.ecr.ap-northeast-1.amazonaws.com

※AWSIDは、自分のアカウントIDを入力します。
次に、Dockerイメージにタグを付与します。

PowerShell
PS C:\Users\testuser> docker tag my-custom-wordpress:latest AWSID.dkr.ecr.ap-northeast-1.amazonaws.com/my-custom-wordpress:latest

いよいよ、イメージをECRにPUSHします!

PowerShell
PS C:\Users\testuser> docker push AWSID.dkr.ecr.ap-northeast-1.amazonaws.com/my-custom-wordpress:latest

実行後「unexpected status from HEAD request to https://AWSID.dkr.ecr.ap-northeast-1.amazonaws.com/v2/my-custom-wordpress/manifests/latest: 403 Forbidden」なるエラーが。
どうやら、最後にアップしたイメージを取得するAWS権限が足りなかったようです。
(参考)https://qiita.com/1mono2/items/569ed58bd19db4b006f5
ここまでのエラー対応含め、調整したのが、前段で記載したポリシーになります。
これでECRにイメージをアップできました。

6.GitHubにファイルをアップ

docker-compose.ymlをGitHubにアップしたいと思います。
AWS CodeCommitがサービス終了していますので、GitHubまたはGitlabでコード管理する事になります。

ここまで作業して気付いたのですが、イメージをECRに置くのじゃなくて、GitHubに置いた方がまとめてファイル管理できますね。
しかし、GitHubのストレージ料金が発生しますし、今回の目標はCodePipelineでデプロイすることなので、ECRの方が連携しやすそうです。
ChatGPT先生を信じて、ECRで行きましょう。

Gitの基本コマンドはここでは触れません。
また、GitHubアカウント取得と初期設定も割愛させていただきます。
ファイルをアップするコマンドは、以下の通りです。

cd 作業ディレクトリ
git init
git add .
git commit -m "WordPress configuration"
git remote add origin https://github.com/ID/my-custom-wordpress.git
git push -u origin main

「error: src refspec main does not match any.」というエラーが発生しました。
現在のローカルリポジトリに main ブランチが存在しないために発生しているらしいです。
以下コマンドで、デフォルトのmasterブランチを、mainにリネームします。

git branch -M main

7.次のステップ

ChatGPT先生は以下のように教えてくれました。
1.ローカルでWordPressを起動し、プラグイン設定を完了。
2.設定済みの環境をDockerイメージとして保存。
3.RDS移行とともに、ECS(Fargate)にデプロイ。
4.デプロイ後にS3設定が有効な状態で運用開始。

今は上記の2が完了したところです。
またまた長くなりましたので、3以降は別ページに記載します。

 ★続きのページを投稿したら、ここでご紹介します★

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?