AWS CloudFormationでRedmineデプロイをやってみた

CloudFormationを使って、MarketplaceのBitnamiのRedmineをデプロイしてみました。
Redmine自体の自動デプロイは幾つか記事にありますが、自分自身がAWSの経験が浅いことから少し苦労したので備忘の意味も込めて、こちらに残しておきたいと思います。
今回はAWS MarketPlaceのBitnamiのRedmine（ https://aws.amazon.com/marketplace/pp/prodview-urx6afmwf5y64 ）を使っていますので、Redmine自体の構築は不要になります。なので、細かい設定で迷うことなく構築できます。
ただ、http接続のままとしていますので社内専用か動作確認用など本番以外での使用を推奨します。

---
## アーキテクチャー
CloudFormationで設定している内容になります。至ってシンプルです。

![redmine_architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90447/9b87a054-a7b9-1ea3-f6f3-9eaaf4c639e3.png)

---
## 前提条件
1. AWSアカウントを持っていること（権限はフルアクセスを想定）。
2. AWSでEC2用にアクセスするキーペアを持っていること。

---
## 概要

手順は至ってシンプルです。
1. CloudFormationのYAMLテンプレート(後述のredmine.yaml)を作成する。
2. CloudFormationでスタックを作成→デプロイする。
3. 数分経過したら、PublicDNSにアクセスする。

---
## 手順詳細

1.　以下のYAMLファイルを作成する 

```redmine.yaml
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  KeyPair:
    Description: KeyPair Name
    Type: AWS::EC2::KeyPair::KeyName
# Set Redmine imageid
Mappings:
  StackConfig:
    EC2:
      ImageId: 'ami-0fe437920fe3d64e8' # Redmine
Resources:
# Create VPC
  RedmineVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: RedmineVPC
# Create InternetGateWay
  RedmineIGW:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: RedmineIGW
# Attach IGW VPC
  AttachIGW:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref RedmineIGW
      VpcId: !Ref RedmineVPC
# create RouteTable
  RedminePublicRoute:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref RedmineVPC
      Tags:
        - Key: Name
          Value: RedminePublicRoute
# Set Routeing
  Route:
    Type: AWS::EC2::Route
    DependsOn: AttachIGW
    Properties:
      RouteTableId: !Ref RedminePublicRoute
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref RedmineIGW
# Create PublicSubnet
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: ap-northeast-1a
      CidrBlock: 10.0.1.0/24
      VpcId: !Ref RedmineVPC
      Tags:
        - Key: Name
          Value: RedminePublicSubnet
# Subnet Route connection
  PublicSubnetRouteTabelAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref RedminePublicRoute
# Create security group
# port22 80 443
  RedmineSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: !Ref RedmineVPC
      GroupDescription: RedmineSG
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: RedmineSG
# Create EC2 instance
  RedmineEC2:
    Type: AWS::EC2::Instance
    Properties:
      AvailabilityZone: ap-northeast-1a
      InstanceType: t2.micro
      ImageId: !FindInMap [ StackConfig, EC2, ImageId ]
      KeyName: !Ref KeyPair
      SubnetId: !Ref PublicSubnet
      SecurityGroupIds:
        - !GetAtt RedmineSG.GroupId
      Tags:
        - Key: Name
          Value: RedmineEnv
  # Create ElasticIP
  RedmineIP:
    Type: AWS::EC2::EIP
    Properties:
      InstanceId: !Ref RedmineEC2
# Output public DNS
Outputs:
  PublicDNS:
    Description: EC2 Public DNS
    Value: !GetAtt RedmineEC2.PublicDnsName
```

2.　CloudFormationで[スタックの作成]-[新しいリソースの仕様(標準)]を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90447/9d92a432-0636-ccd5-a974-4d432afefba7.png)

3.　[テンプレートの準備完了]-[テンプレートファイルのアップロード]を選択し、作成したredmine.yamlを選択して[次へ]を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90447/01b0cc13-f35f-c228-eb0c-677bd3ae1d0b.png)

4.　[スタックの名前]に任意の名前、[KeyPair]に作成していたEC2のキーペアを選択して[次へ]を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90447/1071e6b3-8e16-cc99-bd9c-3df4c805c247.png)

5.　スタックオプションの設定ではデフォルトのまま[次へ]を押す。

6.　レビューではデフォルトのまま[スタックの作成]を押す。

7.　約5分でデプロイが完了する。リソースタブで今回の構成で作成されるリソースを確認する。

* 作成されるリソース：　サブネット、EC2、インターネットゲートウェイ、ElasiticIP、セキュリティグループ、VPC
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90447/ec5e59d5-27e1-14dc-38e4-1701291ad90f.png)

8.　出力タブに表示されているPublicDNSにアクセスする。リソースが作成されても、Redmineデプロイ自体に5分はかかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90447/4d0637df-4e00-fedf-5ca2-6b94414899fe.png)

* Redmine画面
![image07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90447/5af78418-2c61-4903-f14e-4bbabf44db92.png)

---
## Redmineログイン方法
RedmineのログインIDは`user`、パスワードはEC2インスタンス画面から[アクション]-[モニタリングとトラブルシューティング]-[システムログを取得]から確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90447/263da822-ce75-1ec0-3867-8cbc4558ce60.png)
今回のパスワードは`Q6nZFraKu2pf`となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90447/9192f253-70f4-74aa-a096-f25e104bd31d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90447/939684c7-c3a2-305e-424c-23b8df03a19b.png)

---
## RedmineEC2インスタンスへのSSHログイン
RedmineEC2インスタンスへのSSHログインIDは`bitnami`、パスワード不要、SSHキーはスタックの詳細を設定で指定したKeyPairの秘密鍵となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90447/9a3686c8-7c08-039e-0968-74fec6af60ad.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90447/45278cff-ac30-00a3-9a09-8075928cf9bf.png)