「広島県リスキリング推進宣言」をしました!

こんにちは!株式会社オプトプランニングです。
当社は、広島県リスキリング推進宣言に賛同し宣言をしました!

また、いろいろとユニークな取り組みをしております。
ぜひ、「取り組みと文化」のページをご覧ください!
https://www.opt-p.co.jp/initiatives/#link_sec_05

取組内容


1.業務に必要なスキルや知識を習得し証明するため、資格取得を応援します。学ぶ機会や環境  を準備し、受験料を負担します。

2.テレワーク体制を整え柔軟な働き方を実現し、「ノー残業デー」の実施により、自ら学ぶ時間を増やします。

3.年齢に関係なく「学びたい」を大切にし、業務の中で発揮できる機会を支援します。

4.自身の勉強したことを発表する場を作り、社内で意見交換を行い、継続的学びの文化を醸成します。



これからも、新しい取り組みにチャレンジしていきます!

aws backupをAWS CLIコマンドで実行する

              図A システム構成図
              図Bバックアップボールドの作成
上記URLに記載があるように、次のポリシー2つをアタッチしたロールを作成
・AWSBackupServiceRolePolicyForBackup
・AWSBackupServiceRolePolicyForRestores
aws backup start-backup-job --backup-vault-name バックアップボールド名 \
--resource-arn arn:aws:ec2:ap-northeast-1:123456789012:instance/インスタンスid
 \
--iam-role-arn arn:aws:iam::123456789012:role/作成したロール名  \
--region ap-northeast-1
$./aws_backup
{
    "BackupJobId": "9905344f-40b9-4a35-941e-40bae97adf99",
    "CreationDate": "2024-01-12T13:44:12.548000+09:00",
    "IsParent": false
}
$./aws_backup

An error occurred (AccessDeniedException) when calling the StartBackupJob operation: Insufficient privileges to perform this action.
$aws backup describe-backup-job --backup-job-id 9905344f-40b9-4a35-941e-40bae97adf99
{
    "AccountId": "123456789012",
    "BackupJobId": "9905344f-40b9-4a35-941e-40bae97adf99",
    "BackupVaultName": "backp_xxxx",
    "BackupVaultArn": "arn:aws:backup:ap-northeast-1:123456789012:backup-vault:backp_xxxx",
    "RecoveryPointArn": "arn:aws:ec2:ap-northeast-1::image/ami-xxxxxxxxxxxxxxxxx",
    "ResourceArn": "arn:aws:ec2:ap-northeast-1:123456789012:instance/i-xxxxxxxxxxxxxxxxx",
    "CreationDate": "2024-01-12T13:44:12.548000+09:00",
    "CompletionDate": "2024-01-12T13:48:18.497000+09:00",
    "State": "COMPLETED",
    "PercentDone": "100.0",
    "BackupSizeInBytes": 32212254720,
    "IamRoleArn": "arn:aws:iam::123456789012:role/backup-xxxx-role",
    "ResourceType": "EC2",
    "BytesTransferred": 0,
    "StartBy": "2024-01-12T21:44:12.548000+09:00",
    "IsParent": false,
    "ResourceName": "Ama_linux2_xxxxxx",
    "InitiationDate": "2024-01-12T13:44:12.835000+09:00",
    "MessageCategory": "SUCCESS"
}
              図C バックアップジョブの確認
            図D バックアップボールトが作成されている

ECS(Fargate)にログインする

               図A システム構成図
%docker container exec -it コンテナ名 bash
のようなことが、ECS Execの機能を利用してFargateでも可能です。
ECS ExecはSystems Manager Session Managerの機能を利用して実現しています。 ECS Execは追加費用なしで利用が可能です

(1)AWS CLI

%curl https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o "awscliv2.zip"
%unzip awscliv2.zip
%sudo ./aws/insstall 又は
%sudo ./aws/insstall --update  # updateの場合

(2)Session Manager plugin for the AWS CLI

%curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm"
%sudo yum install -y session-manager-plugin.rpm
  以下のコマンドを実行
  session-manager-plugin
  The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. と出力されれば、OK
##amazon Linux2の場合です。他のディストリビューションは未調査です。

(1)ECSのタスクロールに以下の権限を追加(ecsTaskExecutionRole)にカスタムポリシーとして追加

{  
 "Version": "2012-10-17",  
 "Statement": [  
     {  
     "Effect": "Allow",  
     "Action": [  
          "ssmmessages:CreateControlChannel",  
          "ssmmessages:CreateDataChannel",  
          "ssmmessages:OpenControlChannel",  
          "ssmmessages:OpenDataChannel"  
     ],  
    "Resource": "*"  
    }  
 ]  
}  

(2) fargateにログインするEC2に権限を追加

{  
  "Version": "2012-10-17",  
  "Statement": [  
      {  
          "Effect": "Allow",  
          "Action": [  
              "ecs:ExecuteCommand",  
              "ssm:StartSession",  
              "ecs:DescribeTasks"  
          ],  
          "Resource": "*"  
      }  
  ]  
} 
以下のコマンドでタスクをサービスに対するECS Execが有効化どうか確認
%aws ecs describe-services \
--cluster クラスター名 \
--services サービス名 | grep enableExecuteCommand
"enableExecuteCommand": true であれば OK

trueでない場合は、trueにする以下のコマンドを実行
%aws ecs update-service \
--cluster クラスター名 \
--service サービス名 \
--enable-execute-command 

変更した場合は、fargateを再起動する必要があります。
               図 B タスクの再起動
%aws ecs list-tasks --cluster クラスター名 --query "taskArns[]" --output text
arn:aws:ecs:ap-northeast-1:123456789012:task/xxxxx-cluster/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

%aws ecs describe-tasks --cluster クラスター名 --tasks  上記コマンドで出力されたタスク名  --query "tasks[].containers[].name" --output text
%aws ecs execute-command --cluster クラスター名 \
    --task タスク名 \
    --container コンテナ名 \
    --interactive \
    --command "/bin/bash" \
              図C fargateにログイン
fargateにログインできました。コマンド一発とはならないですが、目的は達成!
docker container exec -it コンテナ名 bash と同じことができました。
何故、fargateにログインしたかったか?
コンテナ(今回はRedmine)のデータベース環境database.yml、mail送信環境のconfigration.ymlの中身を確認したかったからです。

社内歩数大会

こんにちは!株式会社オプトプランニングです。
今日は、今期の歩数大会の結果を報告します。

当社は、社員全員の健康維持のため、毎年、「歩数大会」というものを催しています。
体格も性別も年齢も異なりますが、とにかく歩いて歩数をカウントするというもの。一番多く歩いた人が優勝です!そして、1年間の結果を集計し、上位3名が毎年表彰されます。

今期の結果、上位5名の実績です。

1位:4,342,726 歩
2位:3,186,334 歩 
3位:3,124,432 歩
4位:3,025,440 歩
5位:3,022,698 歩

1位の社員は、1日約12,000歩
2位の社員は、1日約 8,800歩 歩いていることになります。

年々、ヒートアップしています。
さて来年は、誰が優勝するでしょうか?!

EC2インスタンスの停止保護(無効化/有効化)をAWS CLIとプログラム(Python)で実行してみる

EC2インスタンスの停止保護無効化、有効化をAWS CLIとpythonで実行してみる
              図A AWS 構成図
    aws ec2 modify-instance-attribute \
        --instance-id i-xxxxxxxxxxyyyyyyy \
        --no-disable-api-stop
                 図Bインスタンスの停止保護(AWSコンソール)
    aws ec2 modify-instance-attribute \
        --instance-id i-xxxxxxxxxxyyyyyyy \
        --disable-api-stop
                  図C インスタンスの停止保護(AWSコンソール)
    #!/usr/bin/python3.8
    import sys
    import boto3
    import botocore
    import os
    import traceback
    def get_abc():
            try:
                    client = boto3.client('ec2')
                    response = client.modify_instance_attribute(
                    InstanceId='i-xxxxxxxxxxxyyyyyy',
                    DisableApiStop={
                            'Value': False,
                    },
                    )
                    return(response)
            except Exception as ex:
                    err_message = ex.__class__.__name__
                    t = traceback.format_exception_only(type(ex), ex)
                    print(t,err_message)
                    sys.exit(1)
    
    if __name__ == '__main__':
            response = get_abc()
            print('status=',response['ResponseMetadata']['HTTPStatusCode'])
            print('date',response['ResponseMetadata']['HTTPHeaders']['date'])
            print('server=',response['ResponseMetadata']['HTTPHeaders']['server'])
    boto3を最新にupdateしないと、エラーになることがあります。
    pip3 install -U boto3 
    2023/12/07時点では boto3-1.33.8 のようです
    status= 200
    date Thu, 07 Dec 2023 04:56:22 GMT
    server= AmazonEC2
    response(実行結果)はdictで返却されます。HTTPStatusCode=200が返却されれば
    成功です。HTTPStatusCode,date,serverを出力しています。
    停止保護有効化したインスタンスを停止させようとすると、エラーになります。
    "botocore.exceptions.ClientError: An error occurred (OperationNotPermitted) when calling the StopInstances operation: The instance 'i-xxxxxxxxxyyyyy' may not be stopped. Modify its 'disableApiStop' instance attribute and try again.\n"] ClientError

    事務所移転のお知らせ

    この度、当社は、下記の住所へ事務所を移転しました。

     〒 731-3168

      広島県広島市安佐南区伴南1丁目40-1 

      NEC 広島西風新都システムセンター 5階

    既に、2023年8月25日(金)より業務を開始させていただいております。

    これからも、よろしくお願い申し上げます。

    とても環境のよい所です!すこし写真で紹介しますね。

    入力規則のススメ~ユーザのライセンス種別で制限してみよう~

    はじめに

    こんにちは!株式会社オプトプランニングです。
    Salesforce(Salesforce.com/セールスフォース・ドットコム、略してSFDC)であれこれやってみたことを書いていきます。

    今回は入力規則について書いていこうと思います。
    プロファイル・ユーザ・ロールの入力規則例は公式ヘルプに紹介されているので、ユーザのライセンス種別で制限する方法を紹介します。
    こんなやり方もあるんだ~と参考になれば幸いです。

    実際あった入力規則の盲点

    入力規則を作成する際、プロファイルで制限する方法をよく見かけるため、最初はプロファイルで入力規則を作成していました。

    その後、カスタムプロファイルを増やすために、影響調査を行う過程で「プロファイルを増やす=既存の入力規則の確認・修正・再テストが必要」なことに気づきました。

    また、私が扱っている環境では複数のユーザライセンスが混在しおり、プロファイルではなくユーザのライセンス種別で入力規則を作成できるのではないかと気づきました。

    今回紹介するユーザのライセンス種別で制限する入力規則は、単一のライセンスのみを使用している環境では利用機会がないかもしれないです。。。

    ライセンス種別で入力規則を作るには

    プロファイルで制限する場合、よく見かけるのがプロファイルの名前である「Profile.Name」を使用する例です。
    ライセンス種別で制限する場合は、「UserType」を使用します。

    ライセンス種別は、ユーザに割り当てられたライセンス種別を意味する「User.UserType」、ユーザに割り当てたプロファイルで指定しているライセンス種別を意味する「Profile.UserType」二つありますが、今回は「User.UserType」を使用する方法を紹介します。

    「User.UserType」を「項目の挿入」を使用して入力する場合は、図1のように選択します。

    図1 項目の挿入
    図1 項目の挿入

    SFDCでは様々なユーザライセンスがあるので、ライセンス種別に関して説明は割愛しますが、今回使用するライセンス種別と「UserType」名は以下です。

    ライセンス種別 の名称UserType の名称
    標準ユーザStandard

    他の「UserType」について詳しく知りたい方はこちらを参考にしてください。

    ライセンスで制限する入力規則を作ってみた

    ライセンスで制限する入力規則を実際に作成してみようと思います。
    環境はTrailhead、オブジェクトは「取引先」を使用し、入力規則の作成やレコードの新規登録は「標準ユーザ」ライセンスを持つユーザで行います!

    まずは、以下のような2つの入力規則を作ってみます。

    • 項目「評価」を未選択で保存するとエラーが発生し、項目「評価」にエラーメッセージを表示
    • 項目「会社形態」を未選択で保存するとエラーが発生し、項目「会社形態」にエラーメッセージを表示

    エラー条件数式は以下です。
    「[数式 サンプル] 入力規則により項目の入力を必須とする数式」で紹介されているサンプル数式を活用しました)

    ISPICKVAL(Rating , '')
    ISPICKVAL(Ownership , '')

    その他の設定については図2を参照してください。
    エラー条件式とエラー表示場所以外は項目「会社形態」の設定も同様なので割愛します。

    この入力規則を有効化して、取引先を新規登録しようとすると図3のようなエラーが表示されます。
    (必須項目が未入力状態だと入力規則の判定はされないので、必須項目に適当な文字列を入力しています)

    図2 項目「評価」の入力規則
    図2 項目「評価」の入力規則
    図3 入力規則で項目「評価」「会社形態」でエラー発生
    図3 入力規則で項目「評価」「会社形態」でエラー発生

    先ほど作成した入力規則の確認ができたところで、項目「評価」の入力規則を以下のように変更してみようと思います。

    • ライセンス種別が「標準ユーザ」以外のユーザが項目「評価」を未選択で保存するとエラーが発生し、項目「評価」にエラーメッセージを表示

    変更後のエラー条件式は以下です。

    AND(
    ISPICKVAL(Rating , '') ,
    NOT(ISPICKVAL( $User.UserType , 'Standard'))
    )
    

    「UserType」のデータ型は選択リスト型である点は注意が必要です。
    「Profile.Name」のデータ型はテキスト型なので、演算子での比較が可能ですが、「UserType」のデータ型は選択リスト型なのでこのままでは比較ができず「ISPICKVAL()」関数を使用してデータを比較する必要があります。
    「ISPICKVAL()」の詳細はこちらを参照してください。

    図4が項目「評価」の入力規則変更後です。

    入力規則を変更後、取引先を新規登録しようとすると図5のようなエラーが表示されます。

    ライセンス種別が「標準ユーザ」のユーザは、項目「評価」を未入力でも入力規則にひっかからないことが分かります。

    無事にライセンス種別で制限する入力規則ができました!!

    図4 ライセンス種別で制限した入力規則例
    図4 ライセンス種別で制限した入力規則例
    図5 入力規則で「会社形態」のみエラー
    図5 入力規則で「会社形態」のみエラー

    あとがき

    Salesforceではライセンス種別がたくさん用意されているので、お使いの環境下でどんなライセンス種別があるか知っておくといいかもしれません!

    また、入力規則を作成する際はライセンスで制限をかける場合もプロファイルで制限をかける場合も、作りたい入力規則が誰に対して制限したいものなのかを明確にしておくといいと思います。

    今回はユーザのライセンス種別での制限方法を紹介しましたが、ロールを使用する方法などを含め、プロファイル以外で制限をする方法も知っておくといいと思います。

    それでは、またお会いしましょう!!

    社内 野の花画伯から 里山の花々

    全国的に暑くなってまいりましたね。
    久しぶりに、社内 野の花画伯から、新作の絵が届きました。

    「里山の花々」です。

    ササユリ、アザミ、撫子、アカマンマ、ツユクサ、リンドウなどなど。

    どれも身近に咲いている花々たちですが、1枚の紙に描かれることで、
    それぞれの色合いや形が引き立ち、華やかな雰囲気を醸し出しています。

    花の1つ、「アカマンマ」という花ですが、別名「イヌタデ」というそうです。
    タデ科の一年草で日本全土、アジアに広く分布しています。
    みなさまの身近にも咲いているかもしれませんね。

    アカマンマの由来は、粒上の赤紫色の花を赤飯の粒にみたて、
    こどもたちが、ままごとに使ったことからだそうです。

    画面下中央のテントウムシが、良い表情だと思いませんか?!

    出典 小学館 日本大百科全書(ニッポニカ)日本大百科全書(ニッポニカ)について

    AWS ECSサービスを構築しよう(その2)

    ECSサービス構築の二回目です。前回は,ECRに登録するdockerイメージをコンテナから作成するところまででした。今回は,ECRリポジトリーに登録,ECSサービスの構築手順です。
                図A 利用するAWSリソースと構成図

    1. ECRにリポジトリ作成

    作成したコンテナイメージを、コンテナレジストリのフルマネージドサービスである Amazon Elastic Container Registry (Amazon ECR) にアップロード(Push)します。
    作成したコンテナイメージを、コンテナレジストリで一元管理することで、様々なコンテナ実行環境で利用しやすくなるメリットがあります。AWS コンソールにログインして,ECRリポジトリを作成します。
    引用url ECRとは
                   図B リポジトリ作成
    このuriをコピーして,メモしておきます。後で、イメージのtag付けに必要になります。

    1.2. EC2クライアントからECRにログインする

    EC2クライアントから,ECRにpushする為に,ECRにログインする必要があります。ログイン用のスクリプトを作成します(login.sh)。そのスクリプトを利用してECRにログインします。
    参照した URL AWS ECRにdockerイメージを登録する
    aws ecr get-login --no-include-email --region ap-northeast-1 > login.sh ←一行です
    [ec2-user@ip-10-128-1-19 ECR]$ bash ./login.sh
    WARNING! Using --password via the CLI is insecure. Use --password-stdin.
    WARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
    Login Succeeded ← これが出ればログイン成功
    
    前回作成したイメージから,ECR登録用のイメージtagを作成します。先ほど,コピーしておいた,uriが必要になります。
    (123456789012はアカウントID)
    docker tag redminesql:latest \
    123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/redmine6:latest
    
    ECRにイメージをpushします
    (123456789012はアカウントID)
    docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/redmine6:latest ← 一行です
    
    これで,ECRのリポジトリにdockerイメージの登録が完了しました。
    図AのECR Registoryです。

    2. ECSサービスの構築

    ECSサービスの構築は,ECSクラスターの作成,タスクの定義,サービスの作成という手順で行います。

    2.1 ECSクラスターの作成

    ECS クラスターは、コンテナを動かすための論理的なグループです。ECS を操作するために、まずは ECS クラスターを作成します。AWSコンソールから,クラスターの作成を行います。
    ecs→クラスターの作成をクリックします。設定内容は,クラスター名,実行するVPC,サブネットです。
    引用url ECSクラスターの作成
                図C ECSクラスターの作成1
                  図D ECSクラスターの作成2

    2.2. タスク定義

    タスク定義とは、アプリケーションを動かすために、どのようにコンテナを動かすか、コンテナの動作を定義したものです。 例えば、コンテナイメージの種類、アプリケーションが利用するポート、コンテナが利用するデータボリュームなどを指定できます。
    コンテナを動かす際のブループリントとして機能します。タスク定義をawsコンソールから行います。設定内容は,タスク定義名,ECRのuri,コンテナのlistenポート番号,動作させるサーバ(今回はFargate)です。
    引用 URL タスク定義
                  図E タスク定義1
                  図F タスク定義2
                  図G タスク定義3
                  図H タスク定義4

    2.3. サービスの作成

    サービスとは、ECS 上でコンテナを動かすときに利用する概念の一つです。
    サービスを使用すると、 Amazon ECS クラスターで、指定した数のコンテナ群(タスク)を維持できます。作成するサービスの定義をします。設定内容は,タスク定義の選択,サービス名,実行するVPC,サブネット,セキュリティグループ,ALBです。
    引用url サービスとは
                  図I サービス作成1
                  図J サービス作成2
                  図K サービス作成3
                  図L サービス作成4
                  図M サービス作成5
                     図N サービス作成6

    3.サービスの実行

    サービスの作成に成功したら,サービスを実行します。作成したサービスを選択する。ネットワーキングをクリック。オープンアドレス(ALBのアドレス)をクリックです。
                  図O サービスの実行1
                  図P サービスの実行2
                  図Q サービスの実行3
                  図R サービスの実行4
    ALB経由で,Fargateコンテナのredmineログイン画面が出れば作成完了です。

    AWS ECSサービスを構築しよう(その1)

    Redmine4.2と,依存関係でDBが必要なので,mariaDB(10.11.2)(MySQL系)2つのdockerコンテナを作成します。Redmineコンテナ起動後にwebhookというpluginをインストール,更にDBをRDS(mySQL)に変更後,作成したコンテナからイメージを作成し,ECRに登録します。そのイメージからECSサービスをデプロイします。今回は,ECRに登録するイメージを作成するまでの手順です。

    1. 利用するAWSのリソースと作成するシステム構成図

                 図A システム構成図

    2. Docker環境構築

    EC2(図AのDockerコンテナ)にdocker,docker-composeをインストールして,dockerが動作する環境を構築します。
    #Dockerのインストール
    sudo yum install -y docker
    sudo systemctl start docker
    sudo usermod -a -G docker ec2-user
    #自動起動を有効にする
    sudo systemctl enable docker
    #docker-composeのインストール
    sudo curl -L https://github.com/docker/compose/releases/download/1.28.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose  ←一行です
    sudo chmod +x /usr/local/bin/docker-compose
    
    #Docker Composeが使用できるか確認
    /usr/local/bin/docker-compose --version
    docker-compose version 1.28.5, build c4eb3a1f
    
    コマンド docker ps とすると以下のメッセージ出力
    #Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containe
    rs/json": dial unix /var/run/docker.sock: connect: permission denied
    ###対策 dockerグループにec2-userを追加
    sudo usermod -g docker ec2-user
    

    3. docker-compose.ymlファイルを作成して、docker コンテナを作成

    作成するコンテナの設計図ですね。今回は,redmineとそのDBのコンテナを作成して,webhookというPluginを入れ、更にDBをRDS(Mysql)に変更します。
    version: '3.8'
    services:
      redmine:
        image: redmine:4.2
        container_name: redmine
        ports:
          - 80:3000
        environment:
          REDMINE_DB_MYSQL: redmine-db
          REDMINE_DB_PASSWORD: xxxxxx
        depends_on:
          - redmine-db
        restart: always
    
      redmine-db:
        image: mariadb
        container_name: redmine-db
        ports:
          - 3306:3306
        environment:
          MYSQL_ROOT_PASSWORD: xxxxxx
          MYSQL_DATABASE: redmine
        volumes:
          - ./data/db:/var/lib/mysql
        command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
        restart: always

    4. Docker コンテナの作成と起動

    docker-compose.ymlファイルのあるディレクトリで以下のコマンドを実行します。完了したら,docker ps -a コマンドで動作しているかどうか確認します。
    sudo su
    cd /usr/local/src/redmine
    /usr/local/bin/docker-compose  up -d
    $ docker ps -a
    CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                                       NAMES
    9e7f0be2bc5b   redmine:4.2   "/docker-entrypoint.…"   7 seconds ago   Up 5 seconds   0.0.0.0:80->3000/tcp, :::80->3000/tcp       redmine
    3cd27d886b4f   mariadb       "docker-entrypoint.s…"   8 seconds ago   Up 6 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   redmine-db
    
    
    docker コンテナが作成されて起動されているのがわかります。Webでアクセスして確認しましょう。アドレスは、EC2のグローバルアドレスです。http://xx.xx.xx.xx/ログイン出来ればOKです。
                   図B redmineログイン画面

    5. webhook pluginをコンテナにインストール

    作成したコンテナ(図AのDockerコンテナ)にwebhookというpluginをインストールします。
    #Docker コンテナの中に入ります
    docker container exec -it redmine bash
    # pluginsディレクトリに移ります
    root@f3baf480c406:/usr/src/redmine# cd plugins/
    root@f3baf480c406:/usr/src/redmine/plugins# git clone https://github.com/suer/redmine_webhook.git ← 一行
    root@f3baf480c406:/usr/src/redmine/plugins#  cd redmine_webhook
    root@f3baf480c406:/usr/src/redmine/plugins/redmine_webhook# bundle install
    rake redmine:plugins:migrate RAILS_ENV=production
    #docker コンテナから抜けます
    root@f3baf480c406:/usr/src/redmine/plugins/redmine_webhook# exit
    
    redmine コンテナを再起動します。
    docker stop redmine
    docker start redmine
    ブラウザでアクセスして、管理タブをクリックプラグインが表示されればOKです。
                図C webhook pluginインストール後

    6. RDSと接続

    privateサブネットに作成したRDS(Mysql)に接続させるように変更していきます。
    #database接続定義(database.yml)の作成
    
    production:
      adapter: "mysql2"
      host: "databasexxx.xxxxxx.ap-northeast-1.rds.amazonaws.com"
      port: "3306"
      username: "Admin"
      password: "xxxxxx"
      database: "redmine_db"
    
    database.ymlをdockerコンテナ内にコピー
    sudo docker cp database.yml redmine:/usr/src/redmine/config/
    
    #redmine  migrate実行
    #docker コンテナ内部に入ります
    docker container exec -it redmine bash
    /usr/src/redmin/# bundle exec rake generate_secret_token
    /usr/src/redmine# bundle exec rake db:migrate RAILS_ENV=production
    
    これで,ECSサービスとして起動可能なredmineコンテナが作成できました。
    このコンテナを利用してECRに登録するimageを作成します。

    7. ECR登録用のイメージ作成

    作成したDockerコンテナからECRに登録するイメージを作成します。
    #コンテナからイメージの作成
    $ docker commit redmine redminesql
    
    #イメージの確認
    $ docker images
    REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
    redminesql        latest    304ab9ccde49   8 seconds ago   554MB
    fortune-whale     latest    0df1bdab20e2   2 days ago      280MB
    redmine           4.2       d4ea63462562   2 days ago      531MB
    mariadb           latest    4a632f970181   2 weeks ago     401MB
    docker/whalesay   latest    6b362a9f73eb   7 years ago     247MB
    
    これで登録するdockerのイメージが作成できました。次回は、ECRにログインしてimageの登録,ECSのデプロイ,ECSタスクの実行する手順です。