Serverless Application Repositoryへアプリケーションを公開する

# はじめに

以下の投稿でSAMで作ったリソースを、Serverless Application Repositoryに公開してみたので手順をまとめました。

- [CodeCommitのプルリクをCodeBuildで検証しAWS ChatbotでSlack通知する](https://qiita.com/joe-king-sh/items/d896ec66a93212e92147#%E5%BE%8C%E7%89%87%E4%BB%98%E3%81%91)

基本的には公式の[AWS Serverless Application Repository - アプリケーションの発行](https://docs.aws.amazon.com/ja_jp/serverlessrepo/latest/devguide/serverlessrepo-publishing-applications.html)手順の通りです。

# Serverless Application Repositoryの公開手順
## SAMテンプレートにメタデータを追加
Serverless Application Repositoryに公開するにあたり、アプリケーションについての情報を、SAMテンプレートに追加します。

```yaml:template.yaml
Metadata:
  AWS::ServerlessRepo::Application:
    Name: tests-pullrequest-in-codecommit-using-codebuild-and-notify-slack.
    Description: This repository contains sample code that tests pull requests created in AWS CodeCommit with CodeBuild and notifies to Slack using AWS Chatbot.
    Author: joe-king-sh
    SpdxLicenseId: AML
    LicenseUrl: LICENSE
    ReadmeUrl: README.md
    Labels: ['codecommit','codebuild','awschatbot','slack','lambda','ci','eventbridge']
    HomePageUrl: https://github.com/joe-king-sh/aws-codecommit-pull-request-aws-codebuild-aws-chatbot
    SemanticVersion: 0.0.1
    SourceCodeUrl: https://github.com/joe-king-sh/aws-codecommit-pull-request-aws-codebuild-aws-chatbot
```

## 公開用アプリケーションのパッケージ作成

以下のコマンドで、アプリケーションをパッケージ化しS3へアップロードします。

```zsh
% sam package \
--template-file template.yml \ 
--output-template-file packaged.yml \ 
--s3-bucket serverless-application-repository-deploy-bucket
```

アップロード先のS3バケットはServerlessApplicationRepositoryからアクセスできる必要があり、
あらかじめ、以下の通りにバケットポリシーを設定しておきます。

```json:S3_BucketPolicy 
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service":  "serverlessrepo.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::serverless-application-repository-deploy-bucket/*"
        }
    ]
}
```

## 公開

`sam publish`コマンドで公開します

```zsh
% sam publish \
--template packaged.yml \
--region ap-northeast-1
Publish Succeeded
Created new application with the following metadata:
{
  "Name": "tests-pullrequest-in-codecommit-using-codebuild-and-notify-slack",
  "Description": "This repository contains sample code that tests pull requests created in AWS CodeCommit with CodeBuild and notifies to Slack using AWS Chatbot.",
  "Author": "joe-king-sh",
  "SpdxLicenseId": "AML",
  "LicenseUrl": "s3://serverless-application-repository-deploy-bucket/15d219711004e23a9507e8ab1ce160b7",
  "ReadmeUrl": "s3://serverless-application-repository-deploy-bucket/fa5d01dad58d52938c900bbc34ce3cc1",
  "Labels": [
    "codecommit",
    "codebuild",
    "awschatbot",
    "slack",
    "lambda",
    "ci",
    "eventbridge"
  ],
  "HomePageUrl": "https://github.com/joe-king-sh/aws-codecommit-pull-request-aws-codebuild-aws-chatbot",
  "SemanticVersion": "0.0.1",
  "SourceCodeUrl": "https://github.com/joe-king-sh/aws-codecommit-pull-request-aws-codebuild-aws-chatbot"
}
Click the link below to view your application in AWS console:
https://console.aws.amazon.com/serverlessrepo/home?region=ap-northeast-1#/published-applications/arn:aws:serverlessrepo:ap-northeast-1:757523705531:applications~tests-pullrequest-in-codecommit-using-codebuild-and-notify-slack
```

ディフォルトではパブリック共有が非公開になっています。
必要に応じて、マネジメントコンソールからパブリックアクセスを有効にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541733/01b2b815-fc13-7beb-131d-9b94db0f5af7.png)

# おわりに
SAMでアプリケーションの構築だけでなく、公開まで1コマンドでできるのは楽。

SAMはCfnの拡張だけあって、Cfnリソースを含めても`sam deploy`、`sam validate`などsamコマンドが使えることを最近知って、
これまで。SAMでテンプレートを書いても、結局`aws cloudformation`コマンドでデプロイをしていたので、もっとSAMの利点を生かしていこうと思った。