'AWS Amplify clients always fail to build with Expo

Following the AWS Amplify documentation for Expo with the steps below, building with EAS build fails with

[RUN_FASTLANE] › Executing baseline » Bundle React Native code and images
[RUN_FASTLANE]     the transform cache was reset.
[RUN_FASTLANE] › Generating debug baseline » baseline.app.dSYM
[RUN_FASTLANE] ▸ ** ARCHIVE FAILED **
[RUN_FASTLANE] ▸ The following build commands failed:
[RUN_FASTLANE] ▸    PhaseScriptExecution Bundle\ React\ Native\ code\ and\ images /Users/Rax/Library/Developer/Xcode/DerivedData/baseline-hhrsifdg
[RUN_FASTLANE] ▸ (1 failure)
[RUN_FASTLANE] ** ARCHIVE FAILED **
[RUN_FASTLANE] 
[RUN_FASTLANE] 
[RUN_FASTLANE] The following build commands failed:
[RUN_FASTLANE]  PhaseScriptExecution Bundle\ React\ Native\ code\ and\ images /Users/Rax/Library/Developer/Xcode/DerivedData/baseline-xxxxxxx
[RUN_FASTLANE] (1 failure)
[RUN_FASTLANE] Exit status: 65
[RUN_FASTLANE] 
[RUN_FASTLANE] +-------------+-------------------------+
[RUN_FASTLANE] |           Build environment           |
[RUN_FASTLANE] +-------------+-------------------------+
[RUN_FASTLANE] | xcode_path  | /Applications/Xcode.app |
[RUN_FASTLANE] | gym_version | 2.205.2                 |
[RUN_FASTLANE] | sdk         | iPhoneOS15.2.sdk        |
[RUN_FASTLANE] +-------------+-------------------------+
[RUN_FASTLANE] Looks like fastlane ran into a build/archive error with your project
[RUN_FASTLANE] It's hard to tell what's causing the error, so we wrote some guides on how
[RUN_FASTLANE] to troubleshoot build and signing issues: https://docs.fastlane.tools/codesigning/getting-started/
[RUN_FASTLANE] Before submitting an issue on GitHub, please follow the guide above and make
[RUN_FASTLANE] sure your project is set up correctly.
[RUN_FASTLANE] fastlane uses `xcodebuild` commands to generate your binary, you can see the
[RUN_FASTLANE] the full commands printed out in yellow in the above log.
[RUN_FASTLANE] Make sure to inspect the output above, as usually you'll find more error information there
[RUN_FASTLANE] 
[RUN_FASTLANE] [!] Error building the application - see the log above
[RUN_FASTLANE] Error: Fastlane build failed with unknown error. Please refer to the "Run fastlane" and "Xcode Logs" phases.
Fastlane errors in most cases are not printed at the end of the output, so you may not find any useful information in the last lines of output when lo
[CLEAN_UP_CREDENTIALS] Destroying keychain - XXXXXXXXXX.keychain
[CLEAN_UP_CREDENTIALS] Removing provisioning profile

Build failed
Fastlane build failed with unknown error. Please refer to the "Run fastlane" and "Xcode Logs" phases.
Fastlane errors in most cases are not printed at the end of the output, so you may not find any useful information in the last lines of output when lo
    Error: npx exited with non-zero code: 1


Steps followed:

  1. Create a new project with expo init closing TypeScript with basic navigation.
  2. Install AWS Amplify dependencies with
    expo install aws-amplify aws-amplify-react-native @react-native-community/netinfo  @react-native-async-storage/async-storage @react-native-picker/picker
    
  3. Pull my AWS Amplify project with amplify pull making the following selections:
    ? Select the authentication method you want to use: AWS profile
    ? Please choose the profile you want to use amplify-cli
    ? Which app are you working on? XXXXXXXX
    Backend environment 'dev' found. Initializing...
    ? Choose your default editor: IntelliJ IDEA
    ? Choose the type of app that you're building javascript
    Please tell us about your project
    ? What javascript framework are you using react-native
    ? Source Directory Path:  /
    ? Distribution Directory Path: /
    ? Build Command: eas build --profile development --platform ios --local
    ? Start Command: expo start --dev-client
    
  4. Add specified AWS Amplify boilerplate to App.tsx:
    import { Amplify } from 'aws-amplify'
    import awsconfig from 'aws-exports'
    
    Amplify.configure(awsconfig)
    
  5. Build with
    eas build --profile development --platform ios --local
    

{
  "name": "amptest",
  "version": "1.0.0",
  "main": "node_modules/expo/AppEntry.js",
  "scripts": {
    "start": "expo start",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "web": "expo start --web",
    "eject": "expo eject",
    "test": "jest --watchAll"
  },
  "jest": {
    "preset": "jest-expo"
  },
  "dependencies": {
    "@expo/vector-icons": "^13.0.0",
    "@react-native-async-storage/async-storage": "^1.17.4",
    "@react-native-community/netinfo": "8.2.0",
    "@react-native-picker/picker": "2.4.0",
    "@react-navigation/bottom-tabs": "^6.0.5",
    "@react-navigation/native": "^6.0.2",
    "@react-navigation/native-stack": "^6.1.0",
    "aws-amplify": "^4.3.22",
    "aws-amplify-react-native": "^6.0.4",
    "expo": "~45.0.0",
    "expo-asset": "~8.5.0",
    "expo-constants": "~13.1.1",
    "expo-dev-client": "~0.9.5",
    "expo-font": "~10.1.0",
    "expo-linking": "~3.1.0",
    "expo-splash-screen": "~0.15.1",
    "expo-status-bar": "~1.3.0",
    "expo-system-ui": "~1.2.0",
    "expo-web-browser": "~10.2.0",
    "react": "17.0.2",
    "react-dom": "17.0.2",
    "react-native": "0.68.2",
    "react-native-safe-area-context": "4.2.4",
    "react-native-screens": "~3.11.1",
    "react-native-web": "0.17.7"
  },
  "devDependencies": {
    "@babel/core": "^7.12.9",
    "@types/react": "~17.0.21",
    "@types/react-native": "~0.66.13",
    "jest": "^26.6.3",
    "jest-expo": "~45.0.0",
    "react-test-renderer": "17.0.2",
    "typescript": "~4.3.5"
  },
  "private": true
}



Solution 1:[1]

I've found the cause of the issue, which can only be fully resolved by a change the way AWS Amplify works.

Issue

AWS Amplify adds aws-exports.js to .gitignore in a section bounded by #amplify-do-not-edit-begin/end. This makes some sense since the file contains API keys. But reasonable or not, it creates a problem. Out of the box, AWS Amplify can't work with eas build or other tools that use Git to identify project files.

Short Term Fix

Manually disabling the ignore (e.g. with !aws-exports.js) makes aws-exports.jsavailable to eas build. (Using .easignore is also a possibility but that has downsides and is probably overkill.)

Long Term Solution

Clearly the above is not a long term solution for any real world project since despite what the documentation says) aws-exports.js contains sensitive information and should indeed be ignored by Git. Instead AWS Amplify needs to be able to work with the following approach:

  • do not git-ignore aws-exports.js
  • replace sensitive information values in aws-exports.js with environment variables, that are (i) managed automatically by AWS on the backend (e.g., for hosting builds) and (ii) set in the usual way in other environments (e.g., CI, local builds, etc.) by users.

As is, it feels like Amplify was architected for web hosted apps (e.g. aws-exports.js gets regenerated for them) but that the scenarios for mobile apps were not thought through.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1