こんにちは、広野です。
React プロジェクトを create-react-app で作ったとき、public ディレクトリに manifest.json というファイルが作られます。これはウェブアプリマニフェストと言われるものです。faviconの設定などが書かれています。ここでは、この manifest.json と AWS Amplify に関するナレッジを紹介します。
通常、このままビルド、デプロイを進めるのですが、アプリにアクセスしたときにブラウザの開発者ツールでメッセージが表示されます。メッセージからは以下の webhint に誘導され、ファイルの拡張子を .webmanifest に変更することを推奨されます。
拡張子名を変更しなくても問題はないですし、拡張子名を変更したとしても中身を修正する必要はなく、どうでもいいと言われればそれまでなのですが、開発者ツールにメッセージが表示され続けるのはうっとおしいです。ということで、拡張子名を変えてビルド、デプロイを進めます。
やりたいこと
- AWS Amplify で公開しているアプリ稼働環境にある、manifest.json のファイル名を manifest.webmanifest に変更したい。
発生した問題
しかし、アプリの稼働環境が AWS Amplify のとき、ファイル名を変更するだけだと manifest.webmanifest の書式が間違っているというようなエラーが出てしまいます。実際には webmanifest ファイルへのアクセスができていないようです。
解決策
AWS Amplify Console では、デフォルトでアプリ稼働環境内に配置、公開可能なファイルの拡張子を登録しているようです。
以下の図のように、マネジメントコンソールの「書き換えて、リダイレクト」の設定を書き換えます。| パイプ で区切られた拡張子記述部に、webmanifest を追記してビルド、デプロイすれば解決です。
こうすると、当初ブラウザの開発者ツールに表示されていた webmanifest 拡張子の使用を推奨するメッセージが消えました。
参考: AWS CloudFormation テンプレート
AWS CloudFormation テンプレートで AWS Amplify Console をプロビジョニングしている場合のコードサンプルです。
CustomRules: の部分に上記設定が記述されています。
AWSTemplateFormatVersion: 2010-09-09 Description: CloudFormation template that creates an Amplify environment. # ------------------------------------------------------------# # Input Parameters # ------------------------------------------------------------# Parameters: DomainName: Type: String Description: Domain name for URL. xxxxx.xxx Default: example.com MaxLength: 100 MinLength: 5 SubDomainName: Type: String Description: Sub domain name for URL. xxxx.example.com Default: subdomain MaxLength: 20 MinLength: 1 CodeCommitArn: Type: String Description: The ARN of the CodeCommit repository for your app. Default: MaxLength: 100 MinLength: 10 CodeCommitUrl: Type: String Description: The Clone URL of the CodeCommit repository for your app. Default: https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/samplerepo MaxLength: 100 MinLength: 10 Resources: # ------------------------------------------------------------# # Amplify Role (IAM) # ------------------------------------------------------------# AmplifyRole: Type: AWS::IAM::Role Properties: RoleName: AmplifyExecutionRole-example Description: This role allows Amplify to pull source codes from CodeCommit. AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - amplify.amazonaws.com Action: - sts:AssumeRole Policies: - PolicyName: AmplifyExecutionPolicy-example PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Resource: - !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/amplify/*" Action: - "logs:CreateLogGroup" - "logs:CreateLogStream" - "logs:PutLogEvents" - Effect: Allow Resource: !Ref CodeCommitArn Action: - "codecommit:GitPull" # ------------------------------------------------------------# # Amplify Console # ------------------------------------------------------------# AmplifyConsole: Type: AWS::Amplify::App Properties: Name: AmplifyConsole-example Description: Web App environment Repository: !Ref CodeCommitUrl AutoBranchCreationConfig: EnableAutoBranchCreation: false EnableAutoBuild: true EnablePerformanceMode: false EnableBranchAutoDeletion: false BuildSpec: |- version: 1 frontend: phases: preBuild: commands: - npm ci build: commands: - npm run build - echo "REACT_APP_REGION=$REACT_APP_REGION" >> .env artifacts: baseDirectory: build files: - '**/*' cache: paths: - node_modules/**/* CustomRules: - Source: /<*> Status: 404-200 Target: /index.html - Source: </^[^.]+$|\.(?!(css|gif|ico|jpg|js|png|txt|svg|woff|ttf|map|json|webmanifest)$)([^.]+$)/> Status: 200 Target: /index.html EnvironmentVariables: - Name: REACT_APP_REGION Value: !Ref AWS::Region IAMServiceRole: !GetAtt AmplifyRole.Arn Tags: - Key: Cost Value: Example AmplifyBranchProd: Type: AWS::Amplify::Branch Properties: AppId: !GetAtt AmplifyConsole.AppId BranchName: main Description: production EnableAutoBuild: true EnablePerformanceMode: false AmplifyDomainProd: Type: AWS::Amplify::Domain Properties: AppId: !GetAtt AmplifyConsole.AppId DomainName: !Sub ${DomainName} SubDomainSettings: - BranchName: !GetAtt AmplifyBranchProd.BranchName Prefix: !Sub ${SubDomainName} EnableAutoSubDomain: false
まとめ
いかがでしたでしょうか?
大した内容ではないのですが、地味にハマったのでナレッジとして公開いたしました。みなさまのお役に立てれば幸いです。