samのrubyをCloud9で利用したいんだぁ

# はじめに
Cloud9上でSAMのrubyを使おうとしたら、sam buildが失敗した
build/deployまでやりたい

# 忙しい方へ
## SAMのruby2.5を使う場合

```
$ rvm list known
$ rvm install 2.5.5
$ rvm use 2.5.5
$ rvm use default 2.5.5
# sam build
```

## SAMのruby2.7を使う場合

```
$ rvm get latest
$ rvm list known
$ rvm install 2.7.2
$ rvm use 2.7.2
$ rvm use default 2.7.2
# sam build
```


# sam buildが失敗する
とりあえずCloud9を作ってsam initしてみた
ruby使いたいので、最新のruby2.7を利用

```
$ sam init

        SAM CLI now collects telemetry to better understand customer needs.

        You can OPT OUT and disable telemetry collection by setting the
        environment variable SAM_CLI_TELEMETRY=0 in your shell.
        Thanks for your help!

        Learn More: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-telemetry.html

Which template source would you like to use?
        1 - AWS Quick Start Templates
        2 - Custom Template Location
Choice: 1
What package type would you like to use?
        1 - Zip (artifact is a zip uploaded to S3)
        2 - Image (artifact is an image uploaded to an ECR image repository)
Package type: 1

Which runtime would you like to use?
        1 - nodejs14.x
        2 - python3.8
        3 - ruby2.7
        4 - go1.x
        5 - java11
        6 - dotnetcore3.1
        7 - nodejs12.x
        8 - nodejs10.x
        9 - python3.7
        10 - python3.6
        11 - python2.7
        12 - ruby2.5
        13 - java8.al2
        14 - java8
        15 - dotnetcore2.1
Runtime: 3

Project name [sam-app]: ruby-app

Cloning app templates from https://github.com/aws/aws-sam-cli-app-templates

AWS quick start application templates:
        1 - Hello World Example
        2 - Step Functions Sample App (Stock Trader)
Template selection: 1

    -----------------------
    Generating application:
    -----------------------
    Name: ruby-app
    Runtime: ruby2.7
    Dependency Manager: bundler
    Application Template: hello-world
    Output Directory: .
    
    Next steps can be found in the README file at ./ruby-app/README.md
        

SAM CLI update available (1.20.0); (1.19.0 installed)
To download: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html
$ cd ruby-app/
```

すると、sam buildが失敗した
どうもrubyバージョンが違うみたいです

```
$ sam build
Building codeuri: hello_world/ runtime: ruby2.7 metadata: {} functions: ['HelloWorldFunction']
Running RubyBundlerBuilder:CopySource
Running RubyBundlerBuilder:RubyBundle

Build Failed
Error: RubyBundlerBuilder:RubyBundle - Bundler Failed: Your Ruby version is 2.6.3, but your Gemfile specified ~> 2.7.0
```

バージョン見てみると、確かに2.6.3になってて違った

```
$ rvm list
=* ruby-2.6.3 [ x86_64 ]

# => - current
# =* - current && default
#  * - default
```

# ruby2.7がない

```
$ rvm list known
Warning, new version of rvm available '1.29.12', you are using older version '1.29.8'.
You can disable this warning with:    echo rvm_autoupdate_flag=0 >> ~/.rvmrc
You can enable  auto-update  with:    echo rvm_autoupdate_flag=2 >> ~/.rvmrc
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.10]
[ruby-]2.2[.10]
[ruby-]2.3[.8]
[ruby-]2.4[.6]
[ruby-]2.5[.5]
[ruby-]2.6[.3]
ruby-head

# for forks use: rvm install ruby-head-<name> --url https://github.com/github/ruby.git --branch 2.2

# JRuby
jruby-1.6[.8]
...
```

# rvmバージョンアップ

```
$ rvm get latest
Downloading https://get.rvm.io
Downloading https://raw.githubusercontent.com/rvm/rvm/master/binscripts/rvm-installer.asc
Verifying /home/ec2-user/.rvm/archives/rvm-installer.asc
gpg: Signature made Tue 23 Jul 2019 09:59:45 PM UTC using RSA key ID 39499BDB
gpg: Good signature from "Piotr Kuczynski <piotr.kuczynski@gmail.com>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7D2B AF1C F37B 13E2 069D  6956 105B D0E7 3949 9BDB
GPG verified '/home/ec2-user/.rvm/archives/rvm-installer'
Downloading https://github.com/rvm/rvm/archive/1.29.12.tar.gz
Downloading https://github.com/rvm/rvm/releases/download/1.29.12/1.29.12.tar.gz.asc
gpg: Signature made Fri 15 Jan 2021 06:46:22 PM UTC using RSA key ID 39499BDB
gpg: Good signature from "Piotr Kuczynski <piotr.kuczynski@gmail.com>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7D2B AF1C F37B 13E2 069D  6956 105B D0E7 3949 9BDB
GPG verified '/home/ec2-user/.rvm/archives/rvm-1.29.12.tgz'
Upgrading the RVM installation in /home/ec2-user/.rvm/
    RVM PATH line found in /home/ec2-user/.mkshrc /home/ec2-user/.profile /home/ec2-user/.bashrc /home/ec2-user/.zshrc.
    RVM sourcing line found in /home/ec2-user/.profile /home/ec2-user/.bash_profile /home/ec2-user/.zlogin.
Upgrade of RVM in /home/ec2-user/.rvm/ is complete.

Thanks for installing RVM 🙏
Please consider donating to our open collective to help us maintain RVM.

👉  Donate: https://opencollective.com/rvm/donate


RVM reloaded!
```

# rubyバージョン確認

```
$ rvm list known
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.10]
[ruby-]2.2[.10]
[ruby-]2.3[.8]
[ruby-]2.4[.10]
[ruby-]2.5[.8]
[ruby-]2.6[.6]
[ruby-]2.7[.2]
[ruby-]3[.0.0]
ruby-head

# for forks use: rvm install ruby-head-<name> --url https://github.com/github/ruby.git --branch 2.2

# JRuby
jruby-1.6[.8]
...
```

# ruby version up

```
$ rvm install 2.7.2
Searching for binary rubies, this might take some time.
Found remote file https://rvm_io.global.ssl.fastly.net/binaries/amazon/2/x86_64/ruby-2.7.2.tar.bz2
Checking requirements for amazon.
Requirements installation successful.
ruby-2.7.2 - #configure
ruby-2.7.2 - #download
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 19.3M  100 19.3M    0     0  4311k      0  0:00:04  0:00:04 --:--:-- 4310k
ruby-2.7.2 - #validate archive
ruby-2.7.2 - #extract
ruby-2.7.2 - #validate binary
ruby-2.7.2 - #setup
ruby-2.7.2 - #gemset created /home/ec2-user/.rvm/gems/ruby-2.7.2@global
ruby-2.7.2 - #importing gemset /home/ec2-user/.rvm/gemsets/global.gems..................................
ruby-2.7.2 - #generating global wrappers........
ruby-2.7.2 - #gemset created /home/ec2-user/.rvm/gems/ruby-2.7.2
ruby-2.7.2 - #importing gemsetfile /home/ec2-user/.rvm/gemsets/default.gems evaluated to empty gem list
ruby-2.7.2 - #generating default wrappers........
```

# rvmのバージョン指定

```
$ rvm use 2.7.2
Using /home/ec2-user/.rvm/gems/ruby-2.7.2
$ rvm use default 2.7.2
Using /home/ec2-user/.rvm/gems/ruby-2.7.2
```

# rubyバージョン確認

```
$ ruby -v
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux]
```

# sam build再実行

```
$ sam build
Building codeuri: hello_world/ runtime: ruby2.7 metadata: {} functions: ['HelloWorldFunction']
Running RubyBundlerBuilder:CopySource
Running RubyBundlerBuilder:RubyBundle
Running RubyBundlerBuilder:RubyBundleDeployment

Build Succeeded

Built Artifacts  : .aws-sam/build
Built Template   : .aws-sam/build/template.yaml

Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided
```

# sam deployやってみる
うまいこといきました

```
$ sam deploy --guided

Configuring SAM deploy
======================

        Looking for config file [samconfig.toml] :  Not found

        Setting default arguments for 'sam deploy'
        =========================================
        Stack Name [sam-app]: 
        AWS Region [ap-northeast-1]: 
        #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
        Confirm changes before deploy [y/N]: ｙy
        #SAM needs permission to be able to create roles to connect to the resources in your template
        Allow SAM CLI IAM role creation [Y/n]: Y
        HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
        Save arguments to configuration file [Y/n]: Y
        SAM configuration file [samconfig.toml]: 
        SAM configuration environment [default]: 

        Looking for resources needed for deployment: Not found.
        Creating the required resources...
        Successfully created!

                Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-iyv29hfrgggz
                A different default S3 bucket can be set in samconfig.toml

        Saved arguments to config file
        Running 'sam deploy' for future deployments will use the parameters saved above.
        The above parameters can be changed by modifying samconfig.toml
        Learn more about samconfig.toml syntax at 
        https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html

Uploading to sam-app/bfb2648ca64307a57e49dacfa96ce2a7  555312 / 555312  (100.00%)

        Deploying with following values
        ===============================
        Stack name                   : sam-app
        Region                       : ap-northeast-1
        Confirm changeset            : True
        Deployment s3 bucket         : aws-sam-cli-managed-default-samclisourcebucket-iyv29hfrgggz
        Capabilities                 : ["CAPABILITY_IAM"]
        Parameter overrides          : {}
        Signing Profiles             : {}

Initiating deployment
=====================
HelloWorldFunction may not have authorization defined.
Uploading to sam-app/e3527efba7273788996787ab938f4cf9.template  1089 / 1089  (100.00%)

Waiting for changeset to be created..

CloudFormation stack changeset
---------------------------------------------------------------------------------------------------------------------------------------------------------
Operation                              LogicalResourceId                      ResourceType                           Replacement                          
---------------------------------------------------------------------------------------------------------------------------------------------------------
+ Add                                  HelloWorldFunctionHelloWorldPermissi   AWS::Lambda::Permission                N/A                                  
                                       onProd                                                                                                             
+ Add                                  HelloWorldFunctionRole                 AWS::IAM::Role                         N/A                                  
+ Add                                  HelloWorldFunction                     AWS::Lambda::Function                  N/A                                  
+ Add                                  ServerlessRestApiDeployment47fc2d5f9   AWS::ApiGateway::Deployment            N/A                                  
                                       d                                                                                                                  
+ Add                                  ServerlessRestApiProdStage             AWS::ApiGateway::Stage                 N/A                                  
+ Add                                  ServerlessRestApi                      AWS::ApiGateway::RestApi               N/A                                  
---------------------------------------------------------------------------------------------------------------------------------------------------------

Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:000000000000:changeSet/samcli-deploy1615847480/809d3b74-0036-4114-b9eb-5d59aed93e56


Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: y

2021-03-15 22:33:42 - Waiting for stack create/update to complete

CloudFormation events from changeset
---------------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus                         ResourceType                           LogicalResourceId                      ResourceStatusReason                 
---------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE_IN_PROGRESS                     AWS::IAM::Role                         HelloWorldFunctionRole                 -                                    
CREATE_IN_PROGRESS                     AWS::IAM::Role                         HelloWorldFunctionRole                 Resource creation Initiated          
CREATE_COMPLETE                        AWS::IAM::Role                         HelloWorldFunctionRole                 -                                    
CREATE_IN_PROGRESS                     AWS::Lambda::Function                  HelloWorldFunction                     -                                    
CREATE_IN_PROGRESS                     AWS::Lambda::Function                  HelloWorldFunction                     Resource creation Initiated          
CREATE_COMPLETE                        AWS::Lambda::Function                  HelloWorldFunction                     -                                    
CREATE_IN_PROGRESS                     AWS::ApiGateway::RestApi               ServerlessRestApi                      -                                    
CREATE_IN_PROGRESS                     AWS::ApiGateway::RestApi               ServerlessRestApi                      Resource creation Initiated          
CREATE_COMPLETE                        AWS::ApiGateway::RestApi               ServerlessRestApi                      -                                    
CREATE_IN_PROGRESS                     AWS::Lambda::Permission                HelloWorldFunctionHelloWorldPermissi   -                                    
                                                                              onProd                                                                      
CREATE_IN_PROGRESS                     AWS::ApiGateway::Deployment            ServerlessRestApiDeployment47fc2d5f9   -                                    
                                                                              d                                                                           
CREATE_COMPLETE                        AWS::ApiGateway::Deployment            ServerlessRestApiDeployment47fc2d5f9   -                                    
                                                                              d                                                                           
CREATE_IN_PROGRESS                     AWS::Lambda::Permission                HelloWorldFunctionHelloWorldPermissi   Resource creation Initiated          
                                                                              onProd                                                                      
CREATE_IN_PROGRESS                     AWS::ApiGateway::Deployment            ServerlessRestApiDeployment47fc2d5f9   Resource creation Initiated          
                                                                              d                                                                           
CREATE_IN_PROGRESS                     AWS::ApiGateway::Stage                 ServerlessRestApiProdStage             -                                    
CREATE_IN_PROGRESS                     AWS::ApiGateway::Stage                 ServerlessRestApiProdStage             Resource creation Initiated          
CREATE_COMPLETE                        AWS::ApiGateway::Stage                 ServerlessRestApiProdStage             -                                    
CREATE_COMPLETE                        AWS::Lambda::Permission                HelloWorldFunctionHelloWorldPermissi   -                                    
                                                                              onProd                                                                      
CREATE_COMPLETE                        AWS::CloudFormation::Stack             sam-app                                -                                    
---------------------------------------------------------------------------------------------------------------------------------------------------------

CloudFormation outputs from deployed stack
------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs                                                                                                                                                    
------------------------------------------------------------------------------------------------------------------------------------------------------------
Key                 HelloWorldFunctionIamRole                                                                                                              
Description         Implicit IAM Role created for Hello World function                                                                                     
Value               arn:aws:iam::000000000000:role/sam-app-HelloWorldFunctionRole-13FBVDZ4I4HJ6                                                            

Key                 HelloWorldApi                                                                                                                          
Description         API Gateway endpoint URL for Prod stage for Hello World function                                                                       
Value               https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/                                                                

Key                 HelloWorldFunction                                                                                                                     
Description         Hello World Lambda Function ARN                                                                                                        
Value               arn:aws:lambda:ap-northeast-1:000000000000:function:sam-app-HelloWorldFunction-10BEP6YMG5PNT                                           
------------------------------------------------------------------------------------------------------------------------------------------------------------

Successfully created/updated stack - sam-app in ap-northeast-1
```

# 叩いてみる
curlで作成したAPIを叩くと、問題なく返ってきてくれました
めでたしめでたし

```
$ curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/ 
{"message":"Hello World!"}
```

# 参考
[【AWS】Cloud9でRubyのバージョンをアップデートする方法（rvm使用）](https://qiita.com/nekotter222/items/37f260c56012d2a3557c)
[\[rvm\] rvm バージョンアップする方法 ~ 0から始めるRails編 ~](https://qiita.com/ymiyamae/items/61b6515ba82727b23700)