一時的な認証情報を取得する-AWS

1. IAMユーザーの作成

$ aws iam create-user --user-name dev-user

2. IAMロールの作成

iam-role-trust-policy.json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::{AWSアカウントID}:user/dev-user"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
$ aws iam create-role --role-name dev-role --assume-role-policy-document file://iam-role-trust-policy.json

3. IAMユーザーの設定

IAMユーザーに設定するポリシーを作成します。

iam-user-policy.json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::{AWSアカウントID}:role/dev-role"
        }
    ]
}
$ aws iam create-policy --policy-name dev-user-policy --policy-document file://iam-user-policy.json

IAMユーザーに作成したポリシーの設定を行います。

$ aws iam attach-user-policy --user-name dev-user --policy-arn arn:aws:iam::{AWSアカウントID}:policy/dev-user-policy

4. IAMロールの設定

IAMロールに設定するポリシーを作成します。
※例:S3バケット内のオブジェクトの一覧を表示することができるポリシー。

iam-role-policy.json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::{バケット名}/*"
        }
    ]
}
$ aws iam create-policy --policy-name dev-role-policy --policy-document file://iam-role-policy.json

IAMロールに作成したポリシーの設定を行います。

$ aws iam attach-role-policy --role-name dev-role --policy-arn arn:aws:iam::{AWSアカウントID}:policy/dev-role-policy

5. アクセスキーの作成

$ aws iam create-access-key --user-name dev-user

6. アクセスキーの設定

$ aws configure --profile dev-user
AWS Access Key ID [None]: {作成したアクセスキーID} 
AWS Secret Access Key [None]: {作成したシークレットアクセスキー}
Default region name [None]: None
Default output format [None]: None

7. 認証情報の取得

$ aws sts assume-role --role-arn arn:aws:iam::{AWSアカウントID}:role/dev-role --role-session-name dev-session --duration-second 900 --profile dev-user

ECSをCloudFormationで構築する-AWS

※以下の変数は右の値に変更してください。
・subnet_id:サブネットID
・security_group_id:セキュリティグループID

AWSTemplateFormatVersion: 2010-09-09

Resources:
  ECSLogGroup:
    Type: 'AWS::Logs::LogGroup'
    Properties:
      LogGroupName: /ecs/sample-app

  ECSCluster:
    Type: 'AWS::ECS::Cluster'
    Properties:
      ClusterName: SampleAppCluster

  ECSTaskDefinition:
    Type: 'AWS::ECS::TaskDefinition'
    Properties:
      ContainerDefinitions:
        - Image: 'httpd:2.4'
          LogConfiguration:
            LogDriver: awslogs
            Options:
              awslogs-group: /ecs/sample-app
              awslogs-region: !Ref AWS::Region
              awslogs-stream-prefix: ecs
          Name: sample-app
          PortMappings:
            - ContainerPort: 80
              HostPort: 80
              Protocol: tcp
      Cpu: 256
      ExecutionRoleArn: !Sub 'arn:aws:iam::${AWS::AccountId}:role/ecsTaskExecutionRole'
      Family: task-definition-sample-app
      Memory: 512
      NetworkMode: awsvpc
      RequiresCompatibilities:
        - FARGATE
      RuntimePlatform:
        CpuArchitecture: X86_64
        OperatingSystemFamily: LINUX

  ECSService:
    Type: 'AWS::ECS::Service'
    Properties:
      ServiceName: sample-app-service
      Cluster: !Ref ECSCluster
      DesiredCount: 1
      LaunchType: FARGATE
      NetworkConfiguration:
        AwsvpcConfiguration:
          AssignPublicIp: ENABLED
          SecurityGroups:
            - security_group_id
          Subnets:
            - subnet_id
            - subnet_id
      TaskDefinition: !Ref ECSTaskDefinition

ECSでDockerコンテナをデプロイする-AWS

前提条件

・ECRにDockerイメージをPushしている。 maya313.hatenablog.com

1. タスク定義の作成

ECSで以下の「task.json」ファイルを利用してタスク定義を作成します。
※以下の変数は右の値に変更してください。
・ecr_url:ECRのDockerイメージURL
aws_account_id:AWSアカウントID

task.json

{
    "family": "sample-task-definition",
    "containerDefinitions": [
        {
            "name": "sample-task-definition",
            "image": "ecr_url",
            "cpu": 0,
            "portMappings": [
                {
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp"
                }
            ],
            "essential": true,
            "environment": [],
            "environmentFiles": [],
            "mountPoints": [],
            "volumesFrom": [],
            "ulimits": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-create-group": "true",
                    "awslogs-group": "/ecs/sample-task-definition",
                    "awslogs-region": "ap-northeast-1",
                    "awslogs-stream-prefix": "ecs"
                },
                "secretOptions": []
            }
        }
    ],
    "taskRoleArn": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole",
    "executionRoleArn": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole",
    "networkMode": "awsvpc",
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "1024",
    "memory": "3072",
    "runtimePlatform": {
        "cpuArchitecture": "X86_64",
        "operatingSystemFamily": "LINUX"
    }
}
$ aws ecs register-task-definition --cli-input-json file://home/maya313/task.json

2. クラスターの作成

ECSでクラスターを作成します。

$ aws ecs create-cluster \
--cluster-name sample-cluster \
--capacity-providers "FARGATE" "FARGATE_SPOT" \
--region ap-northeast-1

3. サービスの作成

ECSのクラスターの中にサービスを作成します。
※以下の変数は右の値に変更してください。
・subnet_id:サブネットID
・security_group_id:セキュリティグループID

$ aws ecs create-service \
--cluster sample-cluster \
--service-name sample-service \
--task-definition sample-task-definition \
--desired-count 1 \
--launch-type FARGATE \
--deployment-configuration "deploymentCircuitBreaker={enable=true,rollback=true}" \
--network-configuration "awsvpcConfiguration={subnets=[subnet_id,subnet_id],securityGroups=[security_group_id],assignPublicIp=ENABLED}" \
--enable-ecs-managed-tags

WSLを使用してUbuntuとDockerをインストールする-Windows11

1. WSLとUbuntuのインストール

Windows環境での作業

WindowsPowerShellを起動し、WSLとUbuntuをインストールします。

> wsl --install -d ubuntu

2. Ubuntuの環境へのログイン

Windows環境での作業

> wsl

3. 設定ファイルの変更

Ubuntu環境での作業

「resolv.conf」ファイルの「nameserver」の値を「8.8.8.8」に変更する。

/etc/resolv.conf

nameserver 8.8.8.8

「wsl.conf」ファイルの末尾に以下の設定を追記する。

/etc/wsl.conf

...
[network]
generateResolvConf = false

4. dockerコマンドの利用設定

Ubuntu環境での作業

一般ユーザーでもdockerコマンドを利用できるようにする。

$ sudo usermod -aG docker $USER

5. WSLの再起動

Windows環境での作業

> wsl --shutdown

6. Docker EngineとDocker Composeのインストール

Ubuntu環境での作業

# Docker Engineのインストール
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

# Docker Composeのインストール
$ sudo apt  install docker-compose

ECRにDockerイメージをプッシュする-AWS

1. リポジトリの作成

ECRにイメージをプッシュするリポジトリを作成します。

$ aws ecr create-repository --repository-name {リポジトリ名} --region ap-northeast-1

2. Dockerクライアントの認証

ECRに対してDockerクライアントを認証させます。
認証させることによって、ECRに対してDockerコマンドが利用できるようになります。

$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com

3. イメージにタグを付与

ローカル環境のイメージにタグを付与します。

$ docker tag {ローカル環境のイメージID} {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/{リポジトリ名}:latest

4. イメージのプッシュ

ローカル環境のイメージをECRにプッシュします。

$ docker push {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/{リポジトリ名}:latest

ネットワークをCloudFormationで構築する-AWS

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  EnvironmentName:
    Type: String
    Default: sample-app

  VpcCIDR:
    Type: String
    Default: 10.1.0.0/16

  Subnet1CIDR:
    Type: String
    Default: 10.1.1.0/24

  Subnet2CIDR:
    Type: String
    Default: 10.1.2.0/24

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCIDR
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: !Ref EnvironmentName

  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: !Ref EnvironmentName

  VPCGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC

  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Ref EnvironmentName

  Route:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  Subnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 0, !GetAZs '' ]
      CidrBlock: !Ref Subnet1CIDR
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-1

  Subnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 1, !GetAZs '' ]
      CidrBlock: !Ref Subnet2CIDR
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-2

  SubnetRouteTableAssociation1:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet1

  SubnetRouteTableAssociation2:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet2

  SecurityGroup1:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: SecurityGroup1
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-1

Mariadbのデータを永続化する-Docker

Dockerのコンテナを停止するとコンテナの中のデータは消えてしまいますが、 「volumes」を利用することでコンテナを停止してもデータを保持することができます。

docker-compose.yml

version: '3.9'

services:
  mariadb:
    image: mariadb:10.6
    environment:
      MYSQL_ROOT_PASSWORD: rootroot
      TZ: Asia/Tokyo
    volumes:
      - db-data:/var/lib/mysql
    ports:
      - "3306:3306"

volumes:
  db-data: